C言語goto文完全解説:構文、実用例、ベストプラクティス
C言語goto文完全解説
このガイドでは、C言語のgoto文の仕組み、正しい構文、有用な場面、現代的なコードで一般的に推奨されない理由を学びます。
goto文の構文
goto ラベル;
...
ラベル: 文;
ラベルはコロンに続く識別子です。goto文が実行されると、制御はそのラベルでマークされた行に直接ジャンプします。

例: gotoでループを早期脱出
#include <stdio.h>
int main() {
const int maxInput = 100;
int i;
double number, average, sum = 0.0;
for (i = 1; i <= maxInput; ++i) {
printf("%d. 数値を入力: ", i);
scanf("%lf", &number);
/* ユーザーが負の数を入力したらループの残りをスキップ */
if (number < 0.0) {
goto exit_loop;
}
sum += number;
}
exit_loop:
average = sum / (i - 1);
printf("Sum = %.2f\n", sum);
printf("Average = %.2f", average);
return 0;
}
出力
1. 数値を入力: 3 2. 数値を入力: 4.3 3. 数値を入力: 9.3 4. 数値を入力: -2.9 Sum = 16.60 Average = 5.53
多くの開発者がgotoを避ける理由
goto文は読みにくく、テストしにくく、保守しにくい「スパゲッティコード」を生み出す可能性があります。例:
one:
for (i = 0; i < number; ++i) {
test += i;
goto two;
}
two:
if (test > 5) {
goto three;
}
// ...
ネストしたスコープからの脱出や複雑な制御構造へのジャンプは、プログラムフローを隠蔽し、診断困難なバグを招きます。
gotoが依然として適切な場合
滅多に必要ではありませんが、gotoは以下の特定シナリオを簡素化できます:
- 複数のフラグを使わずに深くネストしたループから脱出
- 関数終了前のクリーンアップコードを一箇所に集約
控えめに使用し、将来の保守者がジャンプの意図を理解できるよう必ずドキュメント化してください。
gotoを使うべきか?
現代的なCプログラムのほとんどでは、構造化制御フロー構造(ループ、関数、switch文)がgotoのユースケースをカバーします。C標準とベストプラクティスガイドラインは、明確な理由がない限りgotoを避けることを推奨しています。C++の生みの親であるBjarne Stroustrup氏の有名な言葉:"'goto'が何でもできるという事実は、まさにそれを使わない理由です。"
最終的に、同じロジックを明確で構造化されたコードで実現できるなら、そちらを選ぶべきです。gotoは稀で十分に正当化された状況に限定し、徹底的にドキュメント化してください。
C言語
- ビーパー(ポケットベル)技術:初期の革新から未来の双方向通信へ
- 部品番号(パートナンバー)とは:在庫管理・販売での役割
- C# 条件分岐をマスターする:if、if-else、if-else if、ネストした if 文
- C# switch 文をマスターする:構文、例、ベストプラクティス
- C# break 文:使い方とタイミングを徹底解説
- C# continue 文をマスターする:ループ反復を効果的にスキップする方法
- C++条件分岐完全ガイド:if、if-else、ネストされたif-elseの仕組みと実例
- C++ break文完全ガイド:ループ脱出の仕組みと実例
- C言語の基本構文マスター:トークン、構造、セミコロン
- Python pass文完全マスター: 実践ガイド
- Python 数値型完全ガイド:不変な数値データ型の理解と活用