今回はgoto文について説明します。
が、滅多に使わないので、読み飛ばしてもよいかと思います。
私個人としても仕事で10年以上プログラムを書きましたが、一度も使ったことがないです。
どこにでも好き勝手に処理をとばせる禁断の技、それがgotoです。(個人の見解です。)
(便宜上、記事のカテゴリを『繰り返し文』にしてありますが、forやwhileとは関係なく使えます。)
動かしてみよう
では、サンプルコードを動かしてみましょう。
サンプルはwhile文・for文のネストで用いた九九の早見表出力プログラムの内側のループにgoto文を挿入したコードです。
ネストしたループとcontinue・break において、continueやbreakでループを1個抜けれると説明しましたが、gotoだと好きなところに処理がとばせるので、ループをまとめて抜けさせてみましょう。
入力欄への記入は不要なので、実行ボタンを押してみてください。
実行できましたか?
gotoにより、1の段の演算途中でループ処理を2つとも抜けたことがわかると思います。
では、解説に進みましょう。
解説
gotoの基本構文は下記です。
goto ラベル名;
ラベル名 : 処理;
『goto ラベル名;』 と書くことで、次におこなう処理を『ラベル名 : 処理;』にできます。
ソースコードの実行位置をラベル名の位置に強制的に移動させるイメージです。
なお、ラベル名には任意の名称をつけることができます。(サンプルコードでは LABEL_GOTO としました。)
注意点
goto文は強力な文です。
強力なため、物事を複雑にしうります。
下記の処理を考えてみましょう。
処理1;
処理2;
処理3;
処理1,2,3を上から順に実行するだけのプログラムですね。
ではgotoを2箇所いれてみましょう。
if(条件A) goto ラベル名;
処理1;
ラベル名:
処理2;
if(条件B) goto ラベル名;
処理3;
処理が飛ばされたり戻ったりするコードになりました。
パッと見だとよくわかりませんが、処理1をやらなかったり、処理2を複数回実施したりする動作をします。
この パッと見だとよくわからない のがgotoのイヤなところかなと思います。
なお、先の例をgotoを使わずに書き直すと下記になります。
if(!条件A) 処理1;
do{
処理2;
}while(条件B);
処理3;
条件Aが不成立の時だけ処理1をおこない、条件Bが成立している間は処理2を繰り返しおこない、処理3は条件に関係なく1度おこなう、という動きですね。
gotoよりもコードの意図が伝わりやすいかなと思います。
まとめ
まとめです。
- gotoで好きなところに処理をとばせる。
- 処理をとばせるので、なんでもできる。
- なんでもできるので、逆にあまり使わない方がいい。
- gotoを使ってるコードは読みにくい。(個人の見解)
以上です。
ではまた。