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