
C言語のきほん|for文の応用パターン
for文は「回す」だけじゃない。刻み幅・逆順・倍数・複数カウンタで、思い通りの繰り返しを作ろう。
for文は3要素をいじるだけで表現力が一気に増える
for文の強みは、初期設定・継続条件・更新の3つを1行にまとめられることでした。
そしてこの3つは、ちょっと工夫するだけで「繰り返しの形」を自由に変えられます。
- 1ずつ増やすだけじゃなく、2ずつ、3ずつ増やす
- 増やすだけじゃなく、減らしてカウントダウンする
- 小数を扱いたい(ただし誤差に注意)
- 2つの変数を同時に動かす
ここまでできるようになると、ループがただの反復ではなく「設計の道具」になってきます。
for文の3要素をもう一度おさらい
for (初期設定式; 継続条件式; 再設定式) {
文;
}| 要素 | 役割 | ここを変えるとどうなる? |
|---|---|---|
| 初期設定式 | どこから始めるか | 開始値が変わる |
| 継続条件式 | いつまで続けるか | 終了条件が変わる |
| 再設定式 | どう進むか | 刻み幅や方向が変わる |
この3つをセットで眺める癖がつくと、for文がスラスラ読めるようになります。
応用パターン1:刻み幅を変える(2ずつ、3ずつ…)
更新を i++ から i += 2 に変えるだけで、奇数だけ・偶数だけ・3の倍数だけ、みたいなループが作れます。
例:0から20までの偶数だけ表示(2ずつ進む)
for (int i = 0; i <= 20; i += 2) {
printf("%d ", i);
}刻み幅を変えるときの注意は、条件式も合わせることです。
i += 3 なのに i <= 10 のままだと、最後の値が期待とズレることがあります。
応用パターン2:逆順に回す(カウントダウン)
増加だけがループじゃありません。減らすループもよく使います。
例:5から1までカウントダウン
for (int i = 5; i >= 1; i--) {
printf("%d ", i);
}カウントダウンのときは、条件式の向きが大事です。
| 書きたい動き | よくある形 |
|---|---|
| 10から1へ減らす | i = 10; i >= 1; i-- |
| 9から0へ減らす | i = 9; i >= 0; i-- |
i <= 1 みたいに、条件を逆に書いてしまうと、1回も回らないことがあるので注意です。
応用パターン3:倍数だけ並べる
刻み幅を倍数にすれば、そのまま倍数列になります。
例:4の倍数を4から40まで表示
for (int i = 4; i <= 40; i += 4) {
printf("%d ", i);
}これ、実務だと「一定間隔で処理する」みたいなときに便利です。
たとえば10件ごとに改行、100回ごとにログ、みたいな制御にもつながります。
応用パターン4:カウンタ変数にdoubleを使う(でも誤差が出る)
文書にもあった通り、forのカウンタ変数にdoubleは使えます。
ただし浮動小数点には誤差があるので、こういうループは罠になりやすいです。
なぜ誤差が出るの?
0.1のような小数は、2進数でピッタリ表せないことが多いです。
なので 0.1 を足し続けると、内部的には 0.999999999… や 2.000000000… のようにズレが蓄積します。
ありがちな現象(2.0が出ない)
0.1ずつ足して2.0まで表示したい
でも内部のズレで、xが2.0をほんの少し超えたり届かなかったりする
結果として、最後の2.0が表示されないことがある

応用パターン5:整数カウンタで誤差を回避する(おすすめ)
小数を扱いたいなら、カウンタはintで回して、表示や計算のときにだけ実数に変換するのが安全です。
例:0.1から2.0までを確実に表示する(誤差回避)
for (int i = 1; i <= 20; i++) {
printf("%.1f ", i / 10.0);
}この方法だと、iは1〜20の整数なのでズレません。
最後に i / 10.0 として実数化するので、狙った表示が安定します。
応用パターン6:forで複数のカウンタ変数を動かす
forは、初期設定式や再設定式にカンマ区切りで複数の処理を書けます。
これができると、両端から詰める処理や、2つの値を同時に動かす処理が1つのループで書けます。
例:左端と右端から同時に近づける
for (int left = 0, right = 8; left < right; left++, right--) {
printf("left=%d right=%d\n", left, right);
}ここで出てくるカンマは2種類あります。
| 場所 | カンマの意味 | 例 |
|---|---|---|
| 初期設定式のカンマ | 変数宣言や代入の区切り | int left = 0, right = 8 |
| 再設定式のカンマ | コンマ演算子(左から順に実行) | left++, right-- |
見た目は同じ , でも役割が違うので、ここはしっかり意識すると混乱しません。
サンプルプログラム
ファイル名:9_4_1.c
// for文の応用パターンをまとめて確認するプログラム
#include <stdio.h>
int main(void)
{
// 1) 1から9までの奇数を表示(2ずつ増やす)
printf("奇数だけ表示(1~9): ");
for (int i = 1; i <= 9; i += 2) {
printf("%d ", i);
}
printf("\n");
// 2) 5から1までカウントダウン
printf("カウントダウン(5→1): ");
for (int i = 5; i >= 1; i--) {
printf("%d ", i);
}
printf("\n");
// 3) 4の倍数を表示(4~40)
printf("4の倍数(4~40): ");
for (int i = 4; i <= 40; i += 4) {
printf("%d ", i);
}
printf("\n");
// 4) 小数の代わりに整数カウンタで0.2刻みを作る(誤差回避)
printf("0.2刻み(0.2~2.0): ");
for (int i = 1; i <= 10; i++) {
printf("%.1f ", i * 0.2);
}
printf("\n");
// 5) 2つのカウンタ変数を同時に動かす
printf("両端から近づく(leftとright):\n");
for (int left = 0, right = 6; left < right; left++, right--) {
printf(" left=%d right=%d\n", left, right);
}
return 0;
}このプログラムは、応用パターンの要点を「短い例で」ぎゅっと体験できる構成です。
for文を読むコツ(応用ほど効く)
応用パターンほど、forの括弧の中を日本語で読むと強いです。
for (int i = 1; i <= 9; i += 2)
- iを1にする
- iが9以下の間は続ける
- 1回ごとに2増やす
この読み方ができると、どんな変則ループでも怖くなくなります。
