🇯🇵 日本語

STEP 4 総合復習 ― for/while・配列・文字列

第16〜23回までの要点を チートシート でおさらいし、コード読み取り6問「よくあるミス」チェックリスト で定着度を確認します。

① 要点チートシート

STEP 4 で押さえておきたい要点を、表で一気に 見直しましょう。

🔁 for 文の3パート

for (int i = 0; i < 3; i++) {
    printf("%d ", i);
}
// 出力: 0 1 2
  • 初期化 / 条件 / 更新 をセミコロンで区切る
  • 条件が偽 になった瞬間ループを抜ける
  • 回数が決まっているとき向き

🔄 while / do-while

// 条件チェック → 実行
while (cond) {
    // 0回以上
}

// 実行 → 条件チェック
do {
    // 最低1回は実行
} while (cond);
  • while: 条件が 最初から偽 なら 1 回も実行されない
  • do-while: 最低 1 回 は実行される(末尾に ; 必要)
  • 回数が決まらない場合に向く

🛑 break / continue

for (int i = 0; i < 5; i++) {
    if (i == 3) break;     // 抜ける → 0 1 2
    if (i == 2) continue;  // この回だけ飛ばす
    printf("%d ", i);
}
  • break: ループを 完全脱出
  • continue: 残りをスキップして 次の回

📦 配列の基本

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] は範囲外!未定義動作
  • 添字は 0 から N-1(要素 N 個なら最後は a[N-1])
  • 範囲外アクセスは 未定義動作(クラッシュや変な値)
  • for と相性が良い: for(i=0; i<N; i++) ... a[i] ...

🔤 文字列(char 配列)

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も含めた箱)
  • C の文字列は 末尾に \0 が必須(自動で付く)
  • strlen は \0 を除いた文字数、sizeof は箱のバイト数
  • #include <string.h> で strlen 等を使用

② コード読み取り 6問

頭の中で実行 してから選択肢をクリック。間違えても解説を読めば必ず腑に落ちます。

Q1. for の境界 (< と <=)

for (int i = 1; i <= 5; i++) {
    printf("%d ", i);
}

出力は?

1 2 3 4
1 2 3 4 5
0 1 2 3 4
2 3 4 5
解説: i <= 5 なので i = 5 まで 実行される。
i = 1, 2, 3, 4, 5 の 5 回
i < 5 なら 1 2 3 4 の 4 回。< と <= で 1 回ズレる のがよくある罠。

Q2. do-while の最低 1 回

int i = 10;
do {
    printf("%d ", i);
    i++;
} while (i < 3);

出力は?

何も出ない
10
10 11 12
無限ループ
解説: do-while は 先に本体を実行 してから条件を見る。
printf("10 ") → i = 11
② 条件 11 < 3 → 偽 → ループ終了
10
※ while で書いていたら最初の条件で偽になり 0 回 だった。do-while は「最低1回」が特徴。

Q3. 配列の合計

int a[] = {2, 4, 6, 8};
int sum = 0;
for (int i = 0; i < 4; i++) sum += a[i];
printf("%d\n", sum);

出力は?

8
14
20
24
解説: sum を 0 から始めて、a[0]=2, a[1]=4, a[2]=6, a[3]=8 を順に足す。
sum: 0 → 2 → 6 → 12 → 20
for と配列の組み合わせは「0 から N-1 まで添字を回す」が定番。

Q4. break で抜ける

for (int i = 0; i < 5; i++) {
    if (i == 3) break;
    printf("%d ", i);
}

出力は?

0 1 2 3 4
0 1 2
0 1 2 4
0 1 2 3
解説: i = 3 になった瞬間 breakループ自体を脱出
i = 3 の printf は実行されないので 3 は出ない。
0 1 2
continue ならその回だけ飛ばすので 0 1 2 4 になる。

Q5. 配列範囲外アクセス

int a[3] = {10, 20, 30};
for (int i = 0; i <= 3; i++) {
    printf("%d ", a[i]);
}

このコードは?

問題なく 10 20 30 と表示される
コンパイルエラー(境界チェックされる)
a[3] にアクセスしてしまい、未定義動作(変な値・クラッシュ)
a[3] は自動的に 0 として扱われる
解説: 要素 3 個の配列なら添字は 0, 1, 2 まで。
i <= 3off-by-one で a[3] にも触る。C は 境界チェックしない ので、
運がよければ偶然 0 だったりするが、運が悪いとクラッシュ・別変数を破壊。
for の境界は i < N(< を使う)。

Q6. 文字列の長さ

#include <stdio.h>
#include <string.h>

int main(void) {
    char s[10] = "Hello";
    printf("%lu\n", strlen(s));
    return 0;
}

出力は?

10(配列の箱の大きさ)
5
6(\0 を含む)
"Hello"
解説: strlen\0 までの文字数"Hello" は H,e,l,l,o の 5 文字
\0 はカウントしないので 6 ではなく 5。
sizeof s なら 10(配列の箱の大きさ)になる。strlen と sizeof は別物。

③ よくあるミス・難所チェックリスト

読みながら「やったことある…」と思ったら、その項目はもう一度元のページに戻って確認しておきましょう。
  1. 1
    <<= の違いで回数が 1 回ズレた
    i<5 は 5 回、i<=5 は 6 回。配列なら範囲外アクセスにつながる。
  2. 2
    更新を書き忘れて無限ループ
    while(i<5){...} の中で i++ を忘れると永遠に終わらない。条件が偽になる仕掛け を必ず用意する。
  3. 3
    配列の添字を 1 から数えた
    C の配列は 0 から。要素 N 個なら添字は 0 〜 N-1
  4. 4
    配列の範囲外にアクセスした
    コンパイルは通る(C は境界チェックしない)が、未定義動作。クラッシュ・別変数破壊・偶然動くなど挙動はバラバラ。
  5. 5
    break と continue を取り違えた
    break はループ脱出、continue は次の回へ。混同すると意図と違う出力に。
  6. 6
    do-while の末尾の ; を忘れた
    } while (cond) の後に セミコロン が必要。while と異なる。
  7. 7
    strlen と sizeof を混同した
    strlen("Hi") は 2(文字数)、sizeof "Hi" は 3(\0 込みのバイト数)。役割が違う。

④ 戻るページ ― つまずいたらここに戻る

特定の項目で迷ったら、対応する元ページにすぐ戻れるよう一覧にしました。
第16回 for 文3パート構造と回数の数え方が曖昧な時に 第17回 while / do-while条件チェックのタイミングを確認したい時に 第18回 確認問題(繰り返し)類題で別アングルから理解を確認 第19回 デバッグの技法無限ループ・添字ミスを切り分けたい時に 第20回 配列添字の範囲・初期化が曖昧な時に 第22回 文字列\0・strlen・sizeof を確認したい時に チートシート(早見表)書式・配列・文字列をまとめて確認