C言語学習ポータル(無料版) 学習コンテンツ 制御構造 while文——条件が決める繰り返し

🔀 制御構造

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 は書き換え可能なので、意図が伝わるほうを選ぶ。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

while文わいるぶん

条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

無限ループむげんるーぷ

終了条件が満たされることなく、永遠に繰り返され続けてしまうループのこと。意図的に使う場合もあるが、多くはバグとして発生する。for(;;)やwhile(1)のように、あえて意図的に書かれることもある。

条件式じょうけんしき

真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。

同じトラックのほかの項目

流れを変える——制御構造の全体像プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられ… if文——もしも、の分かれ道if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる else if / else の分かれ道設計else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる switch文とfallthroughswitch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける do-while文と入力チェックdo-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける breakとcontinueの使いどころbreak でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
‹ for文——回数が決まった繰り返し do-while文と入力チェック ›

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

完全版(BOOTH)を見る

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

Web版 / BOOTH