ダイレクトにジャンプしたい
もしかしたら、プログラムを組んでいて、この行に直接ジャンプできたらいいのに、と思ったことはないだろうか?(まだそれほど多くコーディングしているわけではないため思わなくても問題はない。
今回は制御構文の中でも特殊な処理、特定の場所にジャンプする、という構文を紹介する。
ダイレクトにジャンプするため、非常に処理がわかりやすい・・・かと思いきや、これを多用すると目も当てられないようなスパゲッティーコード(こんがらがって読み解けない様)が出来上がってしまう。
使用には十分注意すること。というよりも、これから紹介する 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 〜; で、 ラベルの位置に処理を飛ばすことができる。