int count = 0;
for (int i = 1; i <= 5; i++) {
count++;
}
printf("count = %d\n", count);
出力結果は?
count = 4
count = 5
count = 6
count = 1
解説:i <= 5 は i が 5 のときもループに入るので、i=1,2,3,4,5 の5回実行。
for (i=1; i<=5; i++) → 5回(i=1〜5)
for (i=1; i<5; i++) → 4回(i=1〜4)
< と <= の違いで1回分のズレが生じます(オフバイワンエラーの原因)。
確認問題6 ― continueの動作
for (int i = 0; i < 5; i++) {
if (i == 2) continue;
printf("%d ", i);
}
出力結果は?
0 1
0 1 2 3 4
0 1 3 4
2
解説:continue は現在の反復だけをスキップし、次の反復に進みます。
break: ループ全体を終了する
continue: 残りの処理をスキップして次へ
i=2 のとき printf をスキップするので、出力は 0 1 3 4。
確認問題7 ― do-whileの最低1回実行
int i = 10;
do {
printf("%d ", i);
i++;
} while (i < 5);
出力結果は?
(何も出力されない)
10
10 11 12 13 14
無限ループ
解説:do-while は条件判定がループの最後にあります。
最初に必ず1回は本体が実行される
1回目で i=10 が出力され、i=11 になる
11 < 5 は偽なのでループ終了
while 文なら条件が最初から偽で一度も実行されませんが、do-while は必ず1回は実行されます。
確認問題8 ― 無限ループの条件
// 以下のうち、無限ループになるのはどれ?// A) for (int i = 0; i < 10; i++) { ... }// B) while (1) { ... } // break なし// C) for (int i = 0; i < 10; ) { i++; }// D) int i = 0; while (i < 10) { i++; }
無限ループになるのは?
A
B
C
D
解説:while (1) は条件が常に真なので、break しない限り終了しません。
A: i が 10 に達すると終了(10回)
B: 条件が常に真 → 無限ループ
C: 本体で i++ しているので 10 に達して終了
D: i++ で i が増えていくので終了
無限ループはイベントループなどで意図的に使いますが、必ず脱出条件(break)を用意しましょう。
確認問題9 ― ネストループ内のbreak
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 2) break;
count++;
}
}
printf("count = %d\n", count);
出力結果は?
count = 9
count = 6
count = 3
count = 0
解説:break は内側の最も近いループのみを抜けます。外側ループは継続します。
内側ループは j=0,1 で count++ を実行、j=2 で break
つまり内側は1回の実行で2回 count++
外側ループ3回 × 内側2回 = 6
外側ループも抜けたい場合はフラグ変数や goto を使うか、関数化して return します。
確認問題10 ― i-- で下がってくる
for の更新部に i-- を使うと、値を減らしていくループが書けます。
for (int i = 5; i >= 0; i--) {
printf("%d ", i);
}