goto文

今回は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を使ってるコードは読みにくい。(個人の見解)

以上です。
ではまた。

タイトルとURLをコピーしました