
C言語入門|制御構文の総仕上げ:無限ループと goto 文
ここまで、本当によく頑張りました 😊
順次・分岐・繰り返しと、制御構文を一通り学び終え、
プログラムの流れを自分の手でコントロールできるようになってきましたね。
この最後のテーマでは、
制御構文の“限界”と“奥の手” を知ります。
- 永久に繰り返す 無限ループ
- 強制的に処理を飛ばす goto 文
どちらも扱いを間違えると危険ですが、
仕組みとリスクを理解したうえで知っておくこと がとても大切です。

無限ループとは何か
強制的に停止しない限り、
永遠に処理を繰り返し続ける構造 を無限ループと呼びます。
初心者のうちは、
- 条件式を書き間違えた。
- ループ変数を更新し忘れた。
といった理由で、
意図せず無限ループに陥ることがよくあります。
ですが実は、
あえて無限ループを作りたい場面 も存在します。
無限ループの代表的な書き方
無限ループを作る代表的な方法は、次の2つです。
while を使う方法
プロジェクト名:5-10-1 ソースファイル名: sample5-10-1.c
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
while (true) {
printf("待機中です...\n");
}
return 0;
}条件式が常に真なので、
ループは一生終わりません。
なお、true の代わりに 1 を使っても同じ意味になります。
for を使う方法
プロジェクト名:5-10-2 ソースファイル名: sample5-10-2.c
#include <stdio.h>
int main(void)
{
for (;;) {
printf("監視処理を実行中\n");
}
return 0;
}for 文の
初期化・条件・更新をすべて省略すると、
条件判定が存在しないため永久ループになります。
無限ループは危険?それとも便利?
無限ループは一見怖そうですが、
- ゲームのメインループ
- サーバーの常駐処理
- 入力待ち状態の管理
などでは、必須のテクニック です。
大切なのは、
- break や return で抜け道を用意する
- 強制終了できることを理解して使う
という意識を持つことです 😊
goto 文という“第4の制御構造”
これまで学んできた制御構造は、
- 順次
- 分岐(if, switch)
- 繰り返し(while, do-while, for)
の3つでした。
実は C 言語には、
もう1つだけ特別な制御方法 が存在します。
それが goto 文です。
goto 文の基本的な動き
goto 文は、
指定した場所に処理を強制ジャンプさせる命令 です。
プロジェクト名:5-10-3 ソースファイル名: sample5-10-3.c
#include <stdio.h>
int main(void)
{
printf("処理を開始します\n");
printf("ステップ1\n");
goto FINISH;
printf("ステップ2\n");
printf("ステップ3\n");
FINISH:
printf("処理を終了します\n");
return 0;
}実行結果
処理を開始します
ステップ1
処理を終了しますgoto 文によって、
途中の処理をすべて飛ばして
ラベルの位置へジャンプしています。
ラベルと goto 文の書式
ラベル
ラベル名:- ソースコード中の目印
- 名前は自由に付けられる。
goto 文
goto ラベル名;- 指定したラベルへ処理を移動
- 同じ関数内でのみ使用可能
goto 文の危険性
goto 文はとても強力です。
ですが、その分リスクも大きい命令です。
乱用すると、
- 処理の流れが追えなくなる。
- バグの原因が特定できない。
- 修正が困難なコードになる。
といった問題が起こります。
このような、
制御が絡み合って理解不能になったコードは
スパゲティプログラム と呼ばれます 🍝
goto 文は「諸刃の剣」
goto 文は、
- 便利だが危険
- 強力だが扱いが難しい。
まさに 諸刃の剣 です。
そのため、開発現場では
- goto 使用禁止
- goto は原則使わない
といったルールが設けられていることも珍しくありません。
それでも goto を使うべき例外的な場面
原則として goto 文はおすすめしません。
それでも、次の2つのケースでは
慎重に使う価値がある とされています。
➀ 深くネストしたループを一気に抜けたいとき
何重にも重なったループを
一発で脱出したい場合、
無理に break を重ねるより
goto のほうが読みやすくなることがあります。
➁ エラー時の後片付け処理
- ファイルを開いた。
- メモリを確保した。
- 通信を開始した。
といった処理の途中でエラーが起きた場合、
後片付けを1か所にまとめるために
goto を使うケースがあります。
制御構文の学習を終えて 😊
これで、あなたは
- 順次
- 分岐
- 繰り返し
- 無限ループ
- ジャンプ
C言語の制御構文をすべて理解しました。
コンピュータに
「どんな順番で、どんな条件で、どこまで処理させるか」
を正確に指示できる力が、もう身についています ✨
