見出し画像

GOTO文を『写経』してから調べてみた

おつかれさまです。Y研究員です。古典的C言語の教科書K&Rを『写経』しています。制御構造の章をやっていますが、どうしても気になるので、章の最後に書いてあったGOTO文を先に『写経』してみました。

GOTO文はソースコード内で任意の場所へ移動できるので、便利そうです。下に使っても良さそうな例を書きます。

#include <cstdio>

int main()
{
    int i_array[5];
    int j_array[5];
    int found_int;

    for (int k = 0; k < 5; k++)
    {
        i_array[k] = (k + 1) * 3;
        j_array[k] = (k + 1) * 5;
    }

    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (i_array[i] == j_array[j])
            {
                found_int = i_array[i];
                goto found;
           }
        }
    }

    printf("No common element\n");
    return 0;

found:
    printf("Found common element: %d\n", found_int);
    return 1;
}

最小公倍数を探しています。多重forループから簡単に抜け出る例が紹介されていました。最初の数が見つかればforループをそれ以上まわす必要は無いので、GOTOを使って結果を表示しています。

しかし現代のプログラミングでGOTO文は理解しにくいプログラムの原因になるため廃れて(駆逐されて)しまいました。ちょっとだけ使うならまだしも、多用すると処理を追いかけるのが困難になります。ここで図で簡潔に説明しているサイトを見つけたので共有します。

https://craftofcoding.wordpress.com/2022/03/28/ever-wondered-why-goto-is-considered-harmful/

左の流れだと72通りで済みますが、ひとつGOTOを入れるだけで組み合わせがいくらでも増えます。GOTOを通る度にパターンが937億4841万6840通りに増えるとあるので、デバッグやテストをするのは困難です。

nはGOTO文を通過する回数

興味がある方はリンク先のblog記事に参照した画像の原典があるのでご活用ください。

しかしよく考えてみたら自分はCでGOTOを使ったことは無く、古いN88 BASICで使っていたと思い出しました。BASICはとても古い言語ですが、素朴な言語なので最初のおもちゃとしては面白いかもしれません。今なら開発ボードが存在し、「くもん」から子供向けの解説書が出ていると発見しました。今回テーマにしたGOTO文は2冊目に入っています。今どきはすぐScratchが最初の教育プログラミング言語とか言われますが、案外BASICも良いかもしれません。。。

さて、その他の議論なども見回りましたが、そもそもGOTO文は機械語的なものだという意見を見ました。たしかにソースコードをコンパイルしてしまえばGOTOの塊になりそうです。プログラミング言語は機械語から人間を開放する物だと考えると、やはりGOTO文は異質だったということでしょう。

写真は古そうなものを探していたら見つけました。たしかパリで見つけた車です。とても古そうな車ですがピカピカで綺麗ですね。オーナーがとても大事にしているとよく分かります。この事例を見習って古いプログラミング言語も大事にしたほうが良さそうです。

今回も『写経』をしていたはずが考古学になりました。それではまた!

般若心経の写経とプログラムの『写経』に関する記事はこちらからどうぞ。

無料のプログラミングクラブCoderDojoを運営するにあたり寄付を受け付けています。お金は会場費・Wifiの費用・教科書に使用します。