goto文

gotoを使うと、指定したラベルの位置まで飛ぶことが出来る。

goto•¶
C言語 - ラベル

BASICの名残であり、現代では使ってはいけないとはよく言われる。

/* ヘッダファイルのインクルード */
#include <stdio.h> /* 標準入出力 */

/* main関数 */
int main(void){

  /* 変数の宣言 */
  int i; /* ループ変数i */
  int j; /* ループ変数j */

  /* 二重ループ */
  for (j = 0; j < 5; j++){ /* jが5ならこのループは終了. */
    for (i = 0; i < 5; i++){ /* iが5ならこのループは終了. */

      /* iとjの出力. */
      printf("i = %d, ", i); /* iを出力, */
      printf("j = %d\n", j); /* jを出力. */

    }
  }

  /* プログラムの終了 */
  return 0; /* 0を返して正常終了. */

}

こういう二重ループを実行すると、

$ vi goto.c
$ gcc goto.c -o goto
$ ./goto
i = 0, j = 0
i = 1, j = 0
i = 2, j = 0
i = 3, j = 0
i = 4, j = 0
i = 0, j = 1
i = 1, j = 1
i = 2, j = 1
i = 3, j = 1
i = 4, j = 1
i = 0, j = 2
i = 1, j = 2
i = 2, j = 2
i = 3, j = 2
i = 4, j = 2
i = 0, j = 3
i = 1, j = 3
i = 2, j = 3
i = 3, j = 3
i = 4, j = 3
i = 0, j = 4
i = 1, j = 4
i = 2, j = 4
i = 3, j = 4
i = 4, j = 4
$

このように最後まで出力される。

/* ヘッダファイルのインクルード */
#include <stdio.h> /* 標準入出力 */

/* main関数 */
int main(void){

  /* 変数の宣言 */
  int i; /* ループ変数i */
  int j; /* ループ変数j */

  /* 二重ループ */
  for (j = 0; j < 5; j++){ /* jが5ならこのループは終了. */
    for (i = 0; i < 5; i++){ /* iが5ならこのループは終了. */

      /* iとjの出力. */
      printf("i = %d, ", i); /* iを出力, */
      printf("j = %d\n", j); /* jを出力. */

      /* iが2なら抜ける. */
      if (i == 2){ /* iが2の時. */
        break; /* breakで抜ける. */
      }

    }
  }

  /* プログラムの終了 */
  return 0; /* 0を返して正常終了. */

}

途中で抜けるにしても、

$ vi goto.c
$ gcc goto.c -o goto
$ ./goto
i = 0, j = 0
i = 1, j = 0
i = 2, j = 0
i = 0, j = 1
i = 1, j = 1
i = 2, j = 1
i = 0, j = 2
i = 1, j = 2
i = 2, j = 2
i = 0, j = 3
i = 1, j = 3
i = 2, j = 3
i = 0, j = 4
i = 1, j = 4
i = 2, j = 4
$

外側は抜けられないので、外側は最後まで実行される。

iが2の時、gotoでendラベルに飛ぶようにすると、

$ vi goto.c
$ gcc goto.c -o goto
$ ./goto
i = 0, j = 0
i = 1, j = 0
i = 2, j = 0
end
$

外側も抜けて、一気にendラベルに飛ぶ。

Sample/c/goto/goto/src/goto at master · bg1bgst333/Sample · GitHub