お風呂を沸かします。「沸くまで待つ」。何分かかるかは、お湯の量にも季節にもよります。回数が先に読めない繰り返し——それが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 の強みです。
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 は書き換え可能なので、意図が伝わるほうを選ぶ。