🔀 制御構造
🎯 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 は「条件が真の間ずっと」。回数が読めない繰り返し向き。本体の中で条件を動かさないと無限ループ。for と while は書き換え可能なので、意図が伝わるほうを選ぶ。
条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。
「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。
終了条件が満たされることなく、永遠に繰り返され続けてしまうループのこと。意図的に使う場合もあるが、多くはバグとして発生する。for(;;)やwhile(1)のように、あえて意図的に書かれることもある。
真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。