C 言語で goto ステートメントを使用する
 
この記事では、C 言語での goto 文の使い方について複数の方法を紹介します。
goto 文を使って C 言語でループを実装する
    
goto キーワードは C 言語の一部であり、無条件にジャンプするための構文を提供します。if や switch 文は条件付きジャンプの例です。goto 構造体は、goto 呼び出しとラベル名の 2つの部分から構成されています。コード中の任意の文の前にはラベルを付けることができます。goto 呼び出しは、ラベルの後の最初の文にジャンプするようにコードを強制的に実行します。goto は同じ関数内でのみラベルにジャンプすることができ、ラベルはどの行で定義されているかに関係なく関数全体で表示されます。
次の例では、各サイクルで変数 score と 1000 を比較する単純なループを示します。score が等しくない場合は、インクリメントして再び比較文にジャンプします。一旦 if 文が真になると、別の goto 呼び出しが呼び出され、実行は EXIT ラベルにジャンプしてプログラムを通常の終了に導きます。この例題コードは、他の多くのコードと同様に、goto 文を使わずに再実装することができ、比較的読みやすいものとなっています。一般的に、goto 文については活発な議論が行われており、ある者は可読性のあるコードにとって全く有害であると考え、またある者はまだ実用的な使用例があると考えています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char **environ;
int main(int argc, char *argv[]) {
  int score = 1;
START:
  if (score > 1000) goto EXIT;
  score += 1;
  goto START;
EXIT:
  printf("score: %d\n", score);
  exit(EXIT_SUCCESS);
}
出力:
score: 1001
goto 文を使って C 言語のネストされたループから抜け出す
goto 文は、ループ内の条件文が満たされた場合に制御フローを変更するのに便利であり、いくつかのコードは同様にスキップする必要があります。以下のコードサンプルでは、環境変数の配列にアクセスして検索するという同様のシナリオを示しています。外部の if 文はポインタが有効かどうかをチェックし、その後にループを実行していることに注目してください。ループ自体はその内部に別の条件を持っており、それぞれの環境変数の特定の文字列をチェックします。文字列が見つかった場合、ループを抜け出して、これ以上処理リソースを無駄にせず、次の printf 文をスキップすることができます。これにより、goto 呼び出しを内側の if 文の中に含めることで、プログラムを外側の if 文の外側にジャンプさせ、残りのコードを実行し続けることができるという便利なケースが生まれます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char **environ;
int main(int argc, char *argv[]) {
  if (environ != NULL) {
    for (size_t i = 0; environ[i] != NULL; ++i) {
      if (strncmp(environ[i], "HOME", 4) == 0) {
        puts(environ[i]);
        goto END;
      }
    }
    printf("No such variable found!\n");
  }
END:
  exit(EXIT_SUCCESS);
}
出力:
HOME=/home/username
