🇯🇵 日本語 | 🇺🇸 English
広告スペース

第15回 while文・do-while文

条件で回数が決まらない繰り返し。前判定 while と後判定 do-while を使い分ける。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • while (条件) { ... } は条件が真の間繰り返す
  • do { ... } while (条件); は最低1回実行
  • 末尾のセミコロン ; を忘れない
⭐ 余裕があれば読む
  • 無限ループ while (1)break での脱出
  • ループ内で条件を変え忘れると無限ループ
  • for と while は相互変換可能

while文 ― 条件が真の間くり返す

while 文は「回数が事前に決まらない」繰り返しに向きます。「ある条件が成り立つ間、ずっと回し続ける」イメージです。日常語なら「~している間は~し続ける」。
while (条件式) {
    // 条件が真の間、ここが繰り返される
}

具体例:2倍していって100を超えるのは何回目?

int n = 1;
int count = 0;
while (n <= 100) {
    n = n * 2;
    count++;
}
printf("%d回で %d になった\n", count, n);
// → 7回で 128 になった
事前に「何回回せば100を超えるか」は分からないので、for ではなく while が向いています。条件チェック → 真なら処理 → 条件チェック… の繰り返しです。

動きを追う(前判定)

1. 条件 n <= 100 をチェック
2. 真なら { ... } の処理を実行
3. } に到達したら 1.に戻る
4. 条件が偽になったらループ終了
ポイント: 最初に条件をチェックするので、最初から偽なら一度も実行されない(0回ループ)。

for と while ― どちらを使うべき?

文法上、for と while は相互変換可能です。どちらでも書けますが、意図を伝える書き方が望ましい。

同じ処理を両方で書いてみる

for文(回数が決まっている)
for (int i = 0; i < 5; i++) {
    printf("%d\n", i);
}
while文(同じ処理)
int i = 0;
while (i < 5) {
    printf("%d\n", i);
    i++;
}
for文のほうが「カウンタ変数 i」「開始・終了・更新」が一目で分かるので、回数が決まっているときは for が自然。

使い分けの指針

シチュエーション向いている構文
回数が決まっているfor配列を0からN-1まで走査
条件で止めたい(回数不明)whileユーザーが "q" を入力するまで
最低1回は実行したいdo-while入力を受け取り、不正なら再入力
無限ループ(break で抜ける)while(1) or for(;;)イベントループ / 対話型プログラム
⚠️ while で忘れがち: ループ内で条件を変化させる処理を書き忘れると無限ループになります。for なら「更新」部分が目に見えて書きやすい分、while は気をつける必要があります。

do-while文 ― 必ず1回は実行するループ

while は条件を先にチェック(前判定)しますが、do-while後でチェック(後判定)します。
そのため、ループの中身が必ず1回は実行されるのが特徴です。
while(前判定)
while (条件) {
    処理;  // 条件が偽なら0回
}
最初から条件が偽なら1回も実行されない
do-while(後判定)
do {
    処理;  // 必ず1回実行
} while (条件);
中身を実行してから条件チェック、最低1回は実行
⚠️ 末尾のセミコロンに注意! } while (条件);; を忘れるとコンパイルエラーになります。do-while だけの特別ルールで、for/while にはない作法。

典型的な使い方:入力の再要求

「1〜3を入力してください」→ 不正な入力なら再度要求、というパターンに最適です。一度は表示する必要があるので do-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);

while vs do-while ― 実行回数の比較

while で条件が最初から偽
int i = 10;
while (i < 5) {
    printf("x");
}
実行0回(何も出力されない)
do-while で条件が最初から偽
int i = 10;
do {
    printf("x");
} while (i < 5);
実行1回("x" が1個出る)

無限ループの罠 ― 条件を変え忘れると…

while と do-while で最も起こりやすいバグが 無限ループ。ループ内で条件を変える処理を書き忘れると、プログラムが永遠に止まらなくなります。
🔴 罠1:カウンタの更新忘れ
int i = 0;
while (i < 5) {
    printf("%d\n", i);
    // ← i++; を書き忘れ!
}
結果: i が永遠に 0 のままなので、i < 5 が偽になることがなく無限ループ。
プログラムは 0 を無限に出力し続けます。強制終了するまで止まりません。
対策: while の中で「ループを終わらせる条件を変える処理」が必ずあるか確認。for 文ならこれを書く場所が文法で決まっているので防ぎやすい。
💡 意図的な無限ループ + break
「条件は書けないけど回り続けてほしい」ときは while (1) を使い、内部で break で抜けます。
while (1) {          // 1 は常に真 → 無限ループ
    int n;
    scanf("%d", &n);
    if (n == 0) break;  // 0 が来たら抜ける
    printf("受け取った: %d\n", n);
}
イベントループやゲームのメインループなどで頻出。break or return で脱出する前提の意図的な書き方です。
⚠️ do-while でも同じリスク
int choice;
do {
    printf("1〜3 > ");
    // ← scanf を書き忘れた!choice が未初期化のまま
} while (choice < 1 || choice > 3);
choice が変化しないので、初期値によっては無限ループに。条件で使う変数が毎回更新されるかを必ず確認しましょう。
実行してしまったら: ターミナルなら Ctrl + C で強制終了できます。Visual Studio なら「デバッグの停止」ボタン。

自分で書いてみよう ― while文

my_while.c
出力
「実行」を押してください...
💡 こんなことも試してみよう
広告スペース

関連する講座

繰り返し・配列・文字列
第14回 for文
決まった回数の繰り返しに使うfor文の基本。
繰り返し・配列・文字列
第16回 デバッグの技法
無限ループを止める方法など、実践的デバッグ技法。
繰り返し・配列・文字列
第19回 配列
ループと組み合わせて大量のデータを処理。
← 前の講座
第14回 for文
次の講座 →
第16回 デバッグの技法

確認クイズ

この講座の理解度をチェックしましょう!

Q1. while(1) はどうなる?

1回だけ実行
無限ループ
コンパイルエラー

条件が常に 1(真)なので、break や return がない限り無限にループし続けます。

Q2. do-while と while の違いは?

違いはない
do-while は最低1回実行される
do-while の方が速い

do-while は条件判定がループの最後にあるため、必ず1回は実行されます。while は最初に条件を判定するため、0回の場合もあります。

Q3. 次のコードの出力回数は?

int i = 10;
while (i < 5) {
    printf("x");
    i++;
}
0回(何も出ない)
1回
5回
無限ループ

while は前判定。最初に i < 5 をチェックして、i=10 なので偽 → ループに入らず終了。実行回数は0回

Q4. 同じ条件で do-while に変えたら?

int i = 10;
do {
    printf("x");
    i++;
} while (i < 5);
0回
1回
5回
無限ループ

do-while は後判定。まず printf("x")1回必ず実行してから条件をチェック。その時点で i=11 で 11 < 5 は偽なので終了。実行回数は1回
「while と do-while で1回分違う」のが典型的な違いです。

Q5. 次のコードの動作は?

int i = 0;
while (i < 5) {
    printf("%d\n", i);
}
0〜4を出力
0 を1回だけ出力
0 を無限に出力し続ける(無限ループ)
コンパイルエラー

i++ を書き忘れているので i は永遠に 0 のまま。条件 i < 5 が偽になることがなく、0 を無限に出力し続けます
これが while を使うときに最も気をつけるべきバグ。強制終了は Ctrl+C。

Q6. do-while 文で、忘れてはいけない記号は?

条件式の括弧 ()
波括弧 {}
末尾のセミコロン ;

} while (条件); の末尾セミコロンは do-while 固有の文法で、忘れるとコンパイルエラー。for や普通の while にはない作法です。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ