ループの罠
ループの罠
このレッスンでできるようになることは、for と do-while の回る回数の違いを見抜き、無限ループの合法な書き方を判別できることです。
まず予測してください
次のコードで、f と d はそれぞれいくつになるでしょうか。
int n = 0;
int f = 0;
for (int i = 0; i < n; i++) {
f++;
}
int d = 0;
int j = 0;
do {
d++;
j++;
} while (j < n);答えは f が 0、d が 1 です。for は本体に入る前に条件を見るので、n が 0 なら一度も本体を実行しません。do-while は本体を実行してから条件を見るので、条件が最初から偽でも必ず 1 回は回ります。試験はこの「do-while は最低 1 回」をよく突いてきます。
for の空欄
for 文の丸括弧の中は、初期化部・条件部・更新部の 3 つに分かれています。この 3 つはすべて省略できます。for (;;) は条件部が真とみなされる無限ループで、コンパイルは問題なく通ります。セミコロンを 2 つ書くことが必須で、for () と書くとコンパイルエラーです。
一方 while は条件を省略できません。while () はコンパイルエラーで、無限ループにしたいときは while (true) と書きます。この非対称が引っ掛けの材料になります。
for (;;) も本体に入ってから break で抜ける形なので、こちらも本体は必ず 1 回は実行されます。
初期化部と更新部のカンマ
初期化部と更新部には、カンマで複数の式を並べられます。ただし初期化部で宣言できるのは 1 つの型だけです。for (int i = 0, j = 10; i < j; i++, j--) は合法ですが、型を 2 回書いた for (int i = 0, long j = 0; ...) はコンパイルエラーになります。
変数のスコープ
for の初期化部で宣言した変数は、その for 文の中だけで生きています。ループを抜けたあとに i を参照するとコンパイルエラーです。ループ後に値を使いたいなら、for の外で宣言してから初期化部で代入だけを行います。
要件
- for 文で f を数える
- do-while 文で d を数える。条件は
while (j < n)にする for (;;)と break で e を数える。break の条件はe >= nにする- 戻り値は
"for=" + f + ",do=" + d + ",inf=" + eの形にする
入出力例
count(0) → "for=0,do=1,inf=1"
count(3) → "for=3,do=3,inf=3"
count(1) → "for=1,do=1,inf=1"