第16〜23回までの要点を チートシート でおさらいし、コード読み取り6問 と 「よくあるミス」チェックリスト で定着度を確認します。
for (int i = 0; i < 3; i++) { printf("%d ", i); } // 出力: 0 1 2
// 条件チェック → 実行 while (cond) { // 0回以上 } // 実行 → 条件チェック do { // 最低1回は実行 } while (cond);
; 必要)for (int i = 0; i < 5; i++) { if (i == 3) break; // 抜ける → 0 1 2 if (i == 2) continue; // この回だけ飛ばす printf("%d ", i); }
int a[5] = {10, 20, 30, 40, 50}; // 添字は 0 から N-1(ここでは 0〜4) printf("%d\n", a[0]); // 10 printf("%d\n", a[4]); // 50 // a[5] は範囲外!未定義動作
for(i=0; i<N; i++) ... a[i] ...char s[] = "Hi"; // メモリ: 'H' 'i' '\0' ← 終端文字 \0 が自動で入る printf("%s\n", s); // Hi printf("%lu\n", strlen(s)); // 2 (\0は数えない) printf("%lu\n", sizeof s); // 3 (\0も含めた箱)
\0 が必須(自動で付く)strlen は \0 を除いた文字数、sizeof は箱のバイト数#include <string.h> で strlen 等を使用for (int i = 1; i <= 5; i++) { printf("%d ", i); }
i <= 5 なので i = 5 まで 実行される。i < 5 なら 1 2 3 4 の 4 回。< と <= で 1 回ズレる のがよくある罠。
int i = 10; do { printf("%d ", i); i++; } while (i < 3);
printf("10 ") → i = 1111 < 3 → 偽 → ループ終了int a[] = {2, 4, 6, 8}; int sum = 0; for (int i = 0; i < 4; i++) sum += a[i]; printf("%d\n", sum);
for (int i = 0; i < 5; i++) { if (i == 3) break; printf("%d ", i); }
break で ループ自体を脱出。continue ならその回だけ飛ばすので 0 1 2 4 になる。
int a[3] = {10, 20, 30}; for (int i = 0; i <= 3; i++) { printf("%d ", a[i]); }
i <= 3 は off-by-one で a[3] にも触る。C は 境界チェックしない ので、i < N(< を使う)。
#include <stdio.h> #include <string.h> int main(void) { char s[10] = "Hello"; printf("%lu\n", strlen(s)); return 0; }
strlen は \0 までの文字数。"Hello" は H,e,l,l,o の 5 文字。sizeof s なら 10(配列の箱の大きさ)になる。strlen と sizeof は別物。
< と <= の違いで回数が 1 回ズレたi<5 は 5 回、i<=5 は 6 回。配列なら範囲外アクセスにつながる。
while(i<5){...} の中で i++ を忘れると永遠に終わらない。条件が偽になる仕掛け を必ず用意する。
break はループ脱出、continue は次の回へ。混同すると意図と違う出力に。
; を忘れた} while (cond) の後に セミコロン が必要。while と異なる。
strlen("Hi") は 2(文字数)、sizeof "Hi" は 3(\0 込みのバイト数)。役割が違う。