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増やす

この読み方ができると、どんな変則ループでも怖くなくなります。