C言語の基本|for文の応用

for文は回数を数えるだけの道具ではありません。
始め方、続ける条件、進め方を工夫すると、繰り返し処理はぐっと自由になります。

for文は、C言語で繰り返し処理を書くときの基本構文です。
最初は i++ で1ずつ増やす形から覚えることが多いですが、for文の良さはそれだけではありません。

for文には、初期設定式、継続条件式、再設定式の3つがあります。
この3つを少し変えるだけで、2ずつ進めたり、逆向きに数えたり、倍数だけを並べたり、2つの変数を同時に動かしたりできます。

こうした応用が分かるようになると、for文は単なる反復処理ではなく、処理の流れを設計するための道具として使えるようになります。
とくに、どこから始めるか、どこまで続けるか、どう進めるかを意識して読む習慣がつくと、少し変わったfor文でも落ち着いて理解できるようになります。

この記事では、for文の3要素を改めて確認しながら、刻み幅の変更、逆順ループ、倍数の処理、小数を扱うときの注意、整数カウンタによる誤差回避、複数カウンタ変数の使い方まで、順番に丁寧に見ていきます。

for文の3要素をもう一度確認する

for文の基本形は次のとおりです。

for (初期設定式; 継続条件式; 再設定式) {
    文;
}

それぞれの要素には、次のような役割があります。

要素役割ここを変えるとどうなるか
初期設定式どこから始めるかを決める開始位置が変わる
継続条件式いつまで続けるかを決める終了のしかたが変わる
再設定式どう進めるかを決める増え方、減り方、方向が変わる

たとえば、次のfor文を見てみましょう。

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

このfor文は、次のように読めます。

  • iを1にして始める
  • iが9以下の間は続ける
  • 1回の繰り返しが終わるごとに2増やす

このように、for文は丸括弧の中を日本語に置き換えて読むと、とても理解しやすくなります。
応用パターンになるほど、この読み方が役に立ちます。

図1:for文の3要素を変えるとループの形が変わる

この図から分かること

for文は、1つの書き方を覚えて終わりではありません。
3つの要素を変えることで、繰り返しの性格そのものを変えられます。

たとえば次のような変化が起こります。

  • 初期設定式を変えると、どの値から始めるかが変わる
  • 継続条件式を変えると、どのタイミングで止まるかが変わる
  • 再設定式を変えると、1ずつ進むのか、2ずつ進むのか、減っていくのかが変わる

この3つをセットで見る癖がつくと、複雑そうに見えるfor文でも落ち着いて読めるようになります。

応用パターン1 刻み幅を変える

for文では、再設定式を i++ から i += 2 や i += 3 に変えることで、進み方を調整できます。
この形は、奇数だけ、偶数だけ、一定間隔ごとに処理したいときに便利です。

たとえば、2から18までの偶数だけを表示したい場合は、次のように書けます。

2から18までの偶数を表示するプログラム

ファイル名:9_4_1.c

#include <stdio.h>

int main(void)
{
    printf("2から18までの偶数を表示します。\n");

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

    printf("\n");

    return 0;
}
実行結果の例
2から18までの偶数を表示します。
2 4 6 8 10 12 14 16 18

このプログラムでは、初期設定式が int i = 2 なので、2から始まります。
継続条件式は i <= 18 なので、18以下である間は繰り返します。
再設定式が i += 2 なので、毎回2ずつ増えていきます。

この書き方のよいところは、偶数だけを取り出したい意図がコードにそのまま表れていることです。
1ずつ増やしながら if文で偶数判定をする方法もありますが、最初から2ずつ進めた方が、狙いが分かりやすくなります。

刻み幅を変えるときは、継続条件式も合わせて確認することが大切です。
たとえば3ずつ増やすのに、終了条件を曖昧にすると、期待した最後の値にならないことがあります。
増え方と終了条件は、必ずセットで見るようにしましょう。

応用パターン2 逆順に回す

for文は、増やすだけでなく、減らしながら回すこともできます。
この形は、カウントダウンや、後ろから順番に処理したい場面でよく使います。

8から2までカウントダウンするプログラム

ファイル名:9_4_2.c

#include <stdio.h>

int main(void)
{
    printf("8から2までカウントダウンします。\n");

    for (int i = 8; i >= 2; i--) {
        printf("%d ", i);
    }

    printf("\n");

    return 0;
}
実行結果の例
8から2までカウントダウンします。
8 7 6 5 4 3 2

このプログラムでは、初期設定式でiを8にしています。
継続条件式は i >= 2 なので、2以上である間は繰り返します。
再設定式が i-- なので、毎回1ずつ減っていきます。

逆順ループで特に注意したいのは、条件式の向きです。
減らしていくのに i <= 2 のように書いてしまうと、最初の時点で条件が成り立たず、1回も実行されないことがあります。

逆順ループを見るときは、次の3点を意識すると分かりやすいです。

  • どの値から始めるか
  • どこまで減らすか
  • 1回ごとにどう減らすか

増加ループと同じように、減少ループでも3要素をセットで見れば混乱しにくくなります。

応用パターン3 倍数だけを並べる

刻み幅を倍数にすれば、そのまま倍数の列を作れます。
この形は、一定間隔ごとの処理や、区切りごとの表示を作るときにも応用しやすいです。

5の倍数を5から50まで表示するプログラム

ファイル名:9_4_3.c

#include <stdio.h>

int main(void)
{
    printf("5の倍数を5から50まで表示します。\n");

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

    printf("\n");

    return 0;
}
実行結果の例
5の倍数を5から50まで表示します。
5 10 15 20 25 30 35 40 45 50

このプログラムでは、最初の値が5で、5ずつ増えながら50まで表示しています。
つまり、5の倍数だけを自然に取り出せています。

この考え方は、ただ数字を並べるだけでなく、次のような場面にもつながります。

  • 10件ごとに改行する
  • 一定回数ごとにログを出す
  • 一定間隔で状態を確認する

for文の再設定式は、単に数を進めるためのものではなく、処理のリズムを決める役割も持っています。
そう考えると、for文の応用範囲が広く見えてきます。

図2:刻み幅と方向を変えるとループの動きが変わる

この図から分かること

for文では、再設定式を変えるだけでなく、初期設定式や継続条件式も合わせて調整することで、いろいろな流れを作れます。

この図の3つの例からは、次のことが分かります。

  • i += 2 にすると、2ずつ進むループになる
  • i-- にすると、逆向きのループになる
  • i += 5 にすると、倍数を並べるループになる

つまり、for文は同じ形のまま、中身だけを変えてさまざまな繰り返しを表現できます。
ここがfor文の大きな強みです。

応用パターン4 doubleをカウンタ変数に使うときの注意

for文のカウンタ変数には、double型を使うこともできます。
ただし、この使い方には注意が必要です。

小数の 0.1 や 0.2 は、コンピュータの内部ではぴったり正確に表せないことがあります。
そのため、小数を何度も足していくと、少しずつ誤差がたまることがあります。

0.2ずつ増やして1.8まで表示するプログラム

ファイル名:9_4_4.c

#include <stdio.h>

int main(void)
{
    printf("0.2ずつ増やして1.8まで表示します。\n");

    for (double x = 0.2; x <= 1.8; x += 0.2) {
        printf("%.17f\n", x);
    }

    return 0;
}
実行結果の例
0.2ずつ増やして1.8まで表示します。
0.20000000000000001
0.40000000000000002
0.60000000000000009
0.80000000000000004
1.00000000000000000
1.19999999999999996
1.39999999999999991
1.59999999999999987
1.79999999999999982

この実行結果を見ると、0.2、0.4、0.6と見えてほしい値が、内部的には少しずつずれていることが分かります。
表示桁数を多くしているので、誤差がはっきり見えています。

短い実験では大きな問題に見えなくても、継続条件式の判定に影響すると困ることがあります。
たとえば、最後にちょうど2.0まで表示したいと思っていても、内部的なずれのせいで思ったように止まらないことがあります。

そのため、小数をカウンタとして直接増やす方法は、学習用としては理解しやすいものの、実際には慎重に使う必要があります。

応用パターン5 整数カウンタで誤差を避ける

小数を扱いたい場合は、カウンタ変数そのものはint型で回し、表示や計算のときだけ実数に変換する方法が安全です。
この考え方を使うと、誤差の影響を受けにくくなります。

0.2刻みの値を整数カウンタで安定して表示するプログラム

ファイル名:9_4_5.c

#include <stdio.h>

int main(void)
{
    printf("0.2刻みの値を0.2から2.0まで表示します。\n");

    for (int i = 1; i <= 10; i++) {
        printf("%.1f ", i * 0.2);
    }

    printf("\n");

    return 0;
}
実行結果の例
0.2刻みの値を0.2から2.0まで表示します。
0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0

このプログラムでは、ループの進行そのものは整数で管理しています。
iは1から10まで、毎回1ずつ増えるだけなので、ループの制御はとても安定しています。

そして、表示するときに i * 0.2 を計算して、小数として出力しています。
こうすると、カウンタ変数の進み方に誤差が入り込まず、意図した回数だけしっかり繰り返せます。

小数を含む処理を書くときは、次のように考えると安全です。

  • ループ制御はできるだけ整数で行う
  • 小数は表示や計算の場面で使う
  • 継続条件式に小数を直接使う場合は慎重に考える

この方法は、実務でもとてもよく使う考え方です。

応用パターン6 複数のカウンタ変数を同時に動かす

for文では、初期設定式や再設定式にカンマを使って、複数の処理を書くことができます。
これを使うと、2つの変数を同時に動かすループが書けます。

左端と右端の位置を同時に動かすプログラム

ファイル名:9_4_6.c

#include <stdio.h>

int main(void)
{
    printf("左端と右端を同時に動かします。\n");

    for (int left = 1, right = 7; left < right; left++, right--) {
        printf("left=%d right=%d\n", left, right);
    }

    return 0;
}
実行結果の例
左端と右端を同時に動かします。
left=1 right=7
left=2 right=6
left=3 right=5

このプログラムでは、初期設定式でleftとrightの2つを同時に用意しています。
leftは1から始まり、rightは7から始まります。

継続条件式は left < right です。
つまり、左側と右側がまだ重なっていない間は、繰り返しを続けます。

再設定式では left++, right-- と書いています。
これによって、leftは右へ進み、rightは左へ進みます。
両端から中央へ近づいていく動きが、1つのfor文で表現できています。

ここで出てくるカンマは、見た目は同じでも役割を意識して読むことが大切です。

場所カンマの役割
初期設定式宣言や代入の区切りint left = 1, right = 7
再設定式複数の更新処理を順に書くleft++, right--

このような書き方は、配列の両端を調べる処理や、2つの値を同時に追いかける処理などで活躍します。

for文を読むコツ

for文の応用パターンが増えてくると、見た目だけで難しそうに感じることがあります。
そんなときは、丸括弧の中を日本語で順番に読むのがいちばん確実です。

たとえば、次のfor文を見てみましょう。

for (int i = 3; i <= 15; i += 3)

これは次のように読めます。

  • iを3にする
  • iが15以下の間は続ける
  • 1回ごとに3増やす

また、次のfor文ならこう読めます。

for (int left = 1, right = 7; left < right; left++, right--)
  • leftを1、rightを7にする
  • leftがrightより小さい間は続ける
  • 1回ごとにleftを1増やし、rightを1減らす

この読み方ができると、応用的なfor文でも落ち着いて理解できます。
とくに次の3点を確認する習慣をつけると効果的です。

  • どこから始めるか
  • いつまで続けるか
  • どう進むか

図3:小数の扱いと複数カウンタの応用

この図から分かること

for文の応用は、刻み幅や方向を変えるだけではありません。
小数をどう安全に扱うか、複数の変数をどう同時に動かすかまで考えられるようになると、表現できる処理が大きく広がります。

この図からは、次のことが読み取れます。

  • doubleを直接カウンタにすると、誤差に注意が必要
  • 小数を使いたいときは、整数カウンタで回してから実数に変換すると安定しやすい
  • 複数のカウンタ変数を使うと、左右から近づくような処理も1つのfor文で書ける

for文は、3要素を工夫するだけでかなり多彩な表現ができる構文です。
そのぶん、1つ1つの要素を丁寧に読む力が大切になります。

for文の応用は3要素を使いこなすことから始まる

for文の応用パターンを見ていくと、特別に難しい構文が増えているわけではありません。
変わっているのは、初期設定式、継続条件式、再設定式の使い方です。

今回見てきた応用を整理すると、次のようになります。

  • 刻み幅を変えると、2ずつや3ずつ進める
  • 減らす形にすると、逆順のループになる
  • 倍数を使うと、一定間隔の処理に応用できる
  • doubleを直接使うと、小数の誤差に注意が必要
  • intでループを制御すると、小数をより安全に扱いやすい
  • 複数カウンタ変数を使うと、2つの動きを同時に管理できる

for文は、ただ回数を数えるだけの構文ではありません。
どのような流れで処理を進めたいかを、コンパクトに表現できるのが大きな魅力です。

応用パターンを見るときは、形だけを暗記するのではなく、丸括弧の中を日本語で読み下して意味をつかむことが大切です。
この読み方ができるようになると、少し変わったfor文に出会っても、落ち着いて理解できるようになります。