C言語の繰り返し処理といえば for
ループが代表的ですが、「繰り返す回数が決まっていない」場合には while
ループが非常に役立ちます。例えば、「ユーザーが特定の文字を入力するまで」や「ファイルの終端に達するまで」といった処理に最適です。
この記事では、while
ループの基本的な使い方から、よく使われる実践的なパターン、そして do-while
ループとの違いまでを分かりやすく解説します。
while
ループの基本
while
ループは、指定された条件式が真(true)である間、ブロック {}
内の処理を繰り返し実行します。
基本構文:
while (条件式) {
// 条件式が真の間、繰り返される処理
}
ループに入る前にまず条件式が評価され、真であれば処理が実行されます。処理が一通り終わると、再び条件式が評価され…という流れを、条件式が偽(false)になるまで続けます。
サンプルコード
0から4までの数値を表示するプログラムです。for
ループでも書けますが、while
の仕組みを理解するのに最適な例です。
#include <stdio.h>
int main(void) {
int count = 0;
// countが5未満の間、ループを続ける
while (count < 5) {
printf("%d\n", count);
count++; // countを1増やす(この行がないと無限ループになる)
}
printf("ループが終了しました。\n");
return 0;
}
count++
で毎回値を更新し、いずれ count < 5
が偽になるようにすることが重要です。
無限ループと break
while(1)
のように、条件式に常に真となる値を指定すると、無限ループを作ることができます。これは、ゲームのメインループや、ユーザーの入力を待ち続けるプログラムなどで意図的に使われます。
無限ループから脱出するには、break
文を使います。
サンプルコード:Enterキーが押されるまで入力を表示する
#include <stdio.h>
int main(void) {
int ch; // getcharの戻り値(EOF)を考慮し、int型で受け取る
printf("文字を入力してください (Enterで終了):\n");
while (1) { // 無限ループ
ch = getchar();
// Enterキー(改行文字)が押されたらループを抜ける
if (ch == '\n') {
break;
}
printf("%c", (char)ch);
}
printf("\n終了しました。\n");
return 0;
}
注意: getchar()
が返す値には、ファイルの終端を示す特別な値 EOF
(End of File) があります。EOF
はchar
型の範囲外にあるため、getchar()
の戻り値を受け取る変数はint
型で宣言するのが安全な作法です。
do-while
ループ:最低1回は実行したいときに
do-while
ループは while
とよく似ていますが、条件式の評価をループ処理の後に行うという決定的な違いがあります。
これにより、ループ内の処理が最低でも1回は必ず実行されることが保証されます。
基本構文:
do {
// 最低1回は実行される処理
} while (条件式); // セミコロンを忘れない
ユーザーに最初に入力を促し、その入力値に応じてループを続けるかどうかを判断する、といった場面で役立ちます。
サンプルコード:0が入力されるまで繰り返す
#include <stdio.h>
int main(void) {
int input_num;
do {
printf("数値を入力してください (0で終了): > ");
scanf("%d", &input_num);
printf("入力された値: %d\n", input_num);
} while (input_num != 0); // 入力値が0でない間、ループを続ける
printf("プログラムを終了します。\n");
return 0;
}
【非推奨】goto
文について
goto
文は、プログラムの実行を指定したラベルに強制的にジャンプさせる機能です。
// goto文の例(使用は推奨されません)
if (error_condition) {
goto ERROR_HANDLER;
}
...
ERROR_HANDLER:
printf("エラーが発生したため終了します。\n");
一見便利に見えるかもしれませんが、goto
を多用すると、プログラムの処理の流れが上から下へと進まず、あちこちにジャンプする**「スパゲッティコード」**と呼ばれる、非常に追いにくく、バグの温床となるコードを生み出します。
現代の構造化プログラミングでは、if
, for
, while
, break
などを適切に使うことで、goto
を使わずに、よりクリーンで分かりやすいロジックを組むことができます。特別な理由がない限り、goto
の使用は避けるべきです。