トラック6・🔀制御構造

for文——回数が決まった繰り返し

読む目安 約12分・ゴール:for文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

ラジオ体操の「深呼吸、4回」。回数が先に決まっている繰り返しはfor文の出番です。

for (初期化式; 継続条件; 更新式) {
    処理
}

3つの部品が並んでいます。動く順番は、慣れるまで少しややこしいので声に出して覚えてください。

  1. 初期化式 — 最初の1回だけ実行する
  2. 継続条件 — 真なら中へ、偽なら終わり
  3. 処理 — 本体を実行する
  4. 更新式 — 1周ぶんの後始末(カウンタを進める)
  5. 2へ戻る

つまり初期化は1回きり、条件は毎周のはじめ、更新は毎周の終わりです。

#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

出力は 1 2 3 4 5 です。i は1から始まり、毎周おわりに1ずつ増え、6になった時点で i <= 5 が偽になって終わります。

🧪 メモリの図解:この図はアプリ内で1行ずつ動かせます。アプリでこのトピックを開く

回数の数え方には定番が2つあります。i = 0; i < n で n 回、i = 1; i <= n でも n 回。C言語では前者、つまり 0から始めて < で止める書き方が圧倒的に多く使われます。配列の添字が0始まりなので、そのまま噛み合うからです(第8トラックで効いてきます)。

合計を求める、いちばん多い使い方も見ておきましょう。

#include <stdio.h>

int main(void) {
    int sum = 0;

    for (int i = 1; i <= 100; i++) {
        sum += i;
    }
    printf("1から100までの合計は %d\n", sum);   // 5050
    return 0;
}

sum をループの外で用意しておくのが要点です。中で宣言すると毎周作り直されて、合計が積み上がりません。「覚えておく箱は外、作業は中」と覚えてください。

ビット「初期化・条件・更新」を声に出して読むと、for は急に怖くなくなるよ。ボクは今でも指で3か所さしながら読んでる

罠を3つ挙げます。

その1、境界の1つ違い。 i <= 5 と i < 5 では回数が1つ違います。これは off-by-one と呼ばれる、プログラミングで最も多いバグの一種です。書いたら必ず「最初の値は? 最後の値は? 何回?」の3つを口に出して確かめてください。

その2、余計なセミコロン。 for (int i = 0; i < 5; i++); と書くと、for の本体は「何もしない文」になります。5回空回りしたあと、下のブロックが1回だけ実行されます。if のときと同じ形の事故です。

その3、i の寿命。 for (int i = …) と書いた i は、ループを抜けると消えます。ループの後で「何回目で止まったか」を使いたいなら、i をループの外で宣言してください。この使い分けは次の次のトピック(break)で実際に必要になります。

まとめます。for は「初期化・条件・更新」の3点セット。初期化は最初の1回だけ。境界の1つ違いに気をつける。積み上げる箱はループの外に置く。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

1から5までを順に表示するforループです。空欄に入るものを選んでください。

for (int i = 1; i <= 5; ____) {
    printf("%d ", i);
}
  1. i++
  2. i--
  3. i + 1
  4. i == 1
答えを見る

正解:A(i++)

更新式には「1周ごとに i をどう変えるか」を書きます。i++ で i が1ずつ増え、6になったところで条件 i <= 5 が偽になってループが終わります。i-- では減り続けて条件が永遠に真=無限ループ。i + 1 は計算するだけで i に代入していないので、これも無限ループです。i == 1 は比較しているだけで、やはり i は動きません。

確認問題 2

次のプログラムを1周ずつ追いかけて、表の空欄を埋めてください。

#include <stdio.h>

int main(void) {
    int sum = 0;
    for (int i = 1; i <= 4; i++) {
        sum = sum + i;
    }
    printf("%d\n", sum);
    return 0;
}
周回isum
ループ前-0
1周目11
2周目2?
3周目3?
4周目4?
答えを見る

空欄の答え(上から順に):3、6、10

sum は「前の値に i を足す」を繰り返します。0 →(+1)→ 1 →(+2)→ 3 →(+3)→ 6 →(+4)→ 10。ループを抜けたあと 10 が表示されます。前の値を覚えておいて足し込む、この積み上げ方が合計を求める定石です。sum をループの外で宣言しているのも要点で、中で宣言すると毎周作り直されて積み上がりません。

「制御構造」の目次

  1. 流れを変える——制御構造の全体像
  2. if文——もしも、の分かれ道
  3. else if / else の分かれ道設計
  4. 条件式の罠——= と == の悲劇
  5. 論理演算子と短絡評価
  6. switch文とfallthrough
  7. for文——回数が決まった繰り返し
  8. while文——条件が決める繰り返し
  9. do-while文と入力チェック
  10. breakとcontinueの使いどころ
  11. ループのネストと九九表
  12. 無限ループとの付き合い方

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版