条件で回数が決まらない繰り返し。前判定 while と後判定 do-while を使い分ける。
while (条件) { ... } は条件が真の間繰り返すdo { ... } while (条件); は最低1回実行; を忘れないwhile (1) と break での脱出while 文は「回数が事前に決まらない」繰り返しに向きます。「ある条件が成り立つ間、ずっと回し続ける」イメージです。日常語なら「~している間は~し続ける」。while (条件式) { // 条件が真の間、ここが繰り返される }
int n = 1; int count = 0; while (n <= 100) { n = n * 2; count++; } printf("%d回で %d になった\n", count, n); // → 7回で 128 になった
n <= 100 をチェック{ ... } の処理を実行} に到達したら 1.に戻るfor (int i = 0; i < 5; i++) { printf("%d\n", i); }
int i = 0; while (i < 5) { printf("%d\n", i); i++; }
| シチュエーション | 向いている構文 | 例 |
|---|---|---|
| 回数が決まっている | for | 配列を0からN-1まで走査 |
| 条件で止めたい(回数不明) | while | ユーザーが "q" を入力するまで |
| 最低1回は実行したい | do-while | 入力を受け取り、不正なら再入力 |
| 無限ループ(break で抜ける) | while(1) or for(;;) | イベントループ / 対話型プログラム |
while は条件を先にチェック(前判定)しますが、do-while は後でチェック(後判定)します。while (条件) { 処理; // 条件が偽なら0回 }
do { 処理; // 必ず1回実行 } while (条件);
} while (条件); の ; を忘れるとコンパイルエラーになります。do-while だけの特別ルールで、for/while にはない作法。int choice; do { printf("1〜3を選択> "); scanf("%d", &choice); if (choice < 1 || choice > 3) printf("不正な入力です\n"); } while (choice < 1 || choice > 3); printf("%dが選択されました\n", choice);
int i = 10; while (i < 5) { printf("x"); }
int i = 10; do { printf("x"); } while (i < 5);
int i = 0; while (i < 5) { printf("%d\n", i); // ← i++; を書き忘れ! }
i < 5 が偽になることがなく無限ループ。while (1) を使い、内部で break で抜けます。while (1) { // 1 は常に真 → 無限ループ int n; scanf("%d", &n); if (n == 0) break; // 0 が来たら抜ける printf("受け取った: %d\n", n); }
break or return で脱出する前提の意図的な書き方です。int choice; do { printf("1〜3 > "); // ← scanf を書き忘れた!choice が未初期化のまま } while (choice < 1 || choice > 3);choice が変化しないので、初期値によっては無限ループに。条件で使う変数が毎回更新されるかを必ず確認しましょう。
Ctrl + C で強制終了できます。Visual Studio なら「デバッグの停止」ボタン。この講座の理解度をチェックしましょう!
条件が常に 1(真)なので、break や return がない限り無限にループし続けます。
do-while は条件判定がループの最後にあるため、必ず1回は実行されます。while は最初に条件を判定するため、0回の場合もあります。
int i = 10; while (i < 5) { printf("x"); i++; }
while は前判定。最初に i < 5 をチェックして、i=10 なので偽 → ループに入らず終了。実行回数は0回。
int i = 10; do { printf("x"); i++; } while (i < 5);
do-while は後判定。まず printf("x") を1回必ず実行してから条件をチェック。その時点で i=11 で 11 < 5 は偽なので終了。実行回数は1回。
「while と do-while で1回分違う」のが典型的な違いです。
int i = 0; while (i < 5) { printf("%d\n", i); }
i++ を書き忘れているので i は永遠に 0 のまま。条件 i < 5 が偽になることがなく、0 を無限に出力し続けます。
これが while を使うときに最も気をつけるべきバグ。強制終了は Ctrl+C。
(){};} while (条件); の末尾セミコロンは do-while 固有の文法で、忘れるとコンパイルエラー。for や普通の while にはない作法です。