ラジオ体操の「深呼吸、4回」。回数が先に決まっている繰り返しはfor文の出番です。
for (初期化式; 継続条件; 更新式) {
処理
}3つの部品が並んでいます。動く順番は、慣れるまで少しややこしいので声に出して覚えてください。
- 初期化式 — 最初の1回だけ実行する
- 継続条件 — 真なら中へ、偽なら終わり
- 処理 — 本体を実行する
- 更新式 — 1周ぶんの後始末(カウンタを進める)
- 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 が偽になって終わります。
回数の数え方には定番が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 をループの外で用意しておくのが要点です。中で宣言すると毎周作り直されて、合計が積み上がりません。「覚えておく箱は外、作業は中」と覚えてください。
罠を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つ違いに気をつける。積み上げる箱はループの外に置く。