トラック6・🔀制御構造

while文——条件が決める繰り返し

読む目安 約11分・ゴール:while文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

お風呂を沸かします。「沸くまで待つ」。何分かかるかは、お湯の量にも季節にもよります。回数が先に読めない繰り返し——それがwhile文の担当です。

while (継続条件) {
    処理
}

条件を確かめてから中へ入り、1周終わるとまた条件を確かめます。偽になった瞬間に抜けます。for から初期化式と更新式を取り去った形、と見ることもできます。

#include <stdio.h>

int main(void) {
    int n = 10;

    while (n > 1) {
        n = n / 2;
        printf("%d ", n);
    }
    printf("\n終わり\n");
    return 0;
}

出力は 5 2 1 のあと「終わり」。10を半分にすると5、5を半分にすると(整数の割り算なので)2、2を半分にすると1。ここで n > 1 が偽になって抜けます。何回で終わるか、書いた時点では誰にも分かりません。この「分からなさ」を受け止められるのが while の強みです。

🧪 メモリの図解:この図はアプリ内で1行ずつ動かせます。アプリでこのトピックを開く

forとの使い分けは、ひとことで言えます。

回数が決まっている → for。条件次第で終わる → while。

「配列の10個を全部見る」「5回表示する」は for。「正しい入力が来るまで聞き直す」「答えが十分な精度になるまで計算する」「ファイルの終わりまで読む」は while です。

文法としては、for と while は互いに書き換えられます。for (;;) と while (true) はまったく同じ意味ですし、for のカウンタを while の外に出して手で書くこともできます。だからこそ、読み手に意図が伝わるほうを選ぶのが正解になります。for を見た人は「回数が決まっているんだな」と読み、while を見た人は「終わりは条件次第だな」と読むからです。

さて、while で最も大事な話をします。条件を変える処理を本体に書き忘れると、無限ループになります。

#include <stdio.h>

int main(void) {
    int n = 10;

    while (n > 1) {
        printf("%d ", n);   // n を変えていない!
    }
    return 0;
}

n は永遠に 10 のままなので、n > 1 は永遠に真。画面が 10 10 10 10 … で埋まり、プログラムは返ってきません。for なら更新式が構文の一部として最初から用意されているので忘れにくいのですが、while は自分で書くしかないぶん、抜けやすいのです。

対策はシンプルで、while を書き終える前に「この条件は、どの行で偽になる?」と1回だけ自問すること。指でその行をさせなければ、それはもうバグです。

師範while を書いたら、抜け道を先に決めよ。入口ではなく出口じゃ。出口の無い部屋に、人は入ってはならぬ

まとめます。while は「条件が真の間ずっと」。回数が読めない繰り返し向き。本体の中で条件を動かさないと無限ループ。for と while は書き換え可能なので、意図が伝わるほうを選ぶ。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

次のうち、for よりも while で書くのが自然な処理はどれですか。

  1. 配列の10個の要素をすべて表示する
  2. 1から100までの合計を求める
  3. 正しい値が入力されるまで、入力を受け付け続ける
  4. 同じメッセージを5回表示する
答えを見る

正解:C(正しい値が入力されるまで、入力を受け付け続ける)

for は「回数が最初から決まっている」繰り返し、while は「終わりが条件次第で読めない」繰り返しに向きます。「10個」「1から100まで」「5回」はどれも回数が先に決まっているので for が自然です。「正しい値が入力されるまで」だけは何回かかるか誰にも分からないので、while(や do-while)の出番になります。

確認問題 2

n を1になるまで半分にしていくループです。空欄に入るものを選んでください。

int n = 10;
while (n ____ 1) {
    n = n / 2;
    printf("%d ", n);
}
  1. > 1
  2. >= 1
  3. == 1
  4. < 1
答えを見る

正解:A(> 1)

while に書くのは「続ける条件」です。n が 1 より大きい間だけ半分にしたいので n > 1。出力は 5 2 1 になります。n >= 1 にすると n が 1 になっても続いてしまい、1 / 2 = 0(整数の割り算)が余計に1回表示されます。== 1 は最初の n が 10 なので偽、< 1 も偽で、どちらも1回も回りません。

「制御構造」の目次

  1. 流れを変える——制御構造の全体像
  2. if文——もしも、の分かれ道
  3. else if / else の分かれ道設計
  4. 条件式の罠——= と == の悲劇
  5. 論理演算子と短絡評価
  6. switch文とfallthrough
  7. for文——回数が決まった繰り返し
  8. while文——条件が決める繰り返し
  9. do-while文と入力チェック
  10. breakとcontinueの使いどころ
  11. ループのネストと九九表
  12. 無限ループとの付き合い方

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版