C言語入門 プログラミング

goto 文

ダイレクトにジャンプしたい

もしかしたら、プログラムを組んでいて、この行に直接ジャンプできたらいいのに、と思ったことはないだろうか?(まだそれほど多くコーディングしているわけではないため思わなくても問題はない。
今回は制御構文の中でも特殊な処理、特定の場所にジャンプする、という構文を紹介する。

ダイレクトにジャンプするため、非常に処理がわかりやすい・・・かと思いきや、これを多用すると目も当てられないようなスパゲッティーコード(こんがらがって読み解けない様)が出来上がってしまう

使用には十分注意すること。というよりも、これから紹介する goto 文を使用する必要がでてきたら多くの場合何かをミスしている。
コーディング規約(プログラムを組む上での決まり事)で使用を禁止していることも多いほど、危険なコードだ。

それをなぜ教えるかというと、コードは書ける必要はなくても読める必要はあるためだ。
(考えにくいが)どこかの参考プログラムで goto を使用していた場合に読み解けなくなってしまう。
そしてgotoの特性を知っておくことで、そのコードがあまりよくないコードであることも判断できるというわけだ。

ココがポイント

goto 文は処理を複雑にする。基本的に使用してはいけない。

goto 文

それでは goto 文の紹介にうつる。
goto とは、何度も説明しているように、特定の場所に処理をジャンプする構文だ。
以下のようにして使う。

 // なんらかの処理
goto ラベル名; // ラベルの位置にジャンプ
// なんらかの処理
ラベル: // ラベルを宣言
// なんらかの処理

いかがだろうか?
一見シンプルでわかりやすいが、問題は goto は上にもジャンプできてしまうため、やろうと思えばいくらでも複雑にかけてしまう。

    int x = 0;
    TOP:
    if( x < 3 )
    {
        goto B;
    }
    else
    {
        goto END;
    }
    A:
    printf( "A" );
    x++;
    B:
    printf( "B" );
    x++;
    C:
    printf( "C" );
    goto TOP;
    END:

たったこれだけでも、読み解くのにちょっと頭を使う。
これが多用されるととても処理を追いきれない様子がわかっていただけると思う。
なお、出力内容は BCBCBC である。

ココがポイント

〜: でラベルを定義。goto 〜; で、 ラベルの位置に処理を飛ばすことができる。

  • この記事を書いた人

GOTH

鹿児島県出身,吉祥寺在住の27歳.職業はゲーム会社でプログラマー.趣味はバイク,車,キャンプ,ガジェット,読書,そしてゲーム開発. サイトのテーマはプログラミングとガジェットでライフハック.たまに趣味に関する雑感や記録を残していく備忘録.ツイッターもやってます.
自己紹介
お問い合わせ

-C言語入門, プログラミング