6日でできる 新C言語入門|for文の基本構造と使い方

繰り返しの流れをつかめば、for文はぐっと使いやすくなる。
基本構造から応用まで理解して、反復処理を自分の力で書けるようになろう。

プログラムを書いていると、同じ処理を何回も続けて実行したい場面がよくあります。
たとえば、1から順番に数を表示したり、合計を求めたり、表のように規則的なデータを並べたりするときです。こうした場面で活躍するのが繰り返し処理です。

C言語には、繰り返し処理を行うための構文として for文、while文、do〜while文 があります。その中でも for文 は、回数や条件を整理して書きやすく、学習の早い段階から何度も登場する大切な構文です。

for文のよいところは、繰り返しを始める準備、続ける条件、1回ごとの変化を1か所にまとめて書けることです。
そのため、何回繰り返すのか、どのように値が変わっていくのかを見通しやすくなります。

一方で、最初のうちは、初期化式・条件式・増分式の役割が少し分かりにくく感じることもあります。また、二重ループや break との組み合わせになると、どの順番で処理が進むのか戸惑うこともあるかもしれません。

この記事では、for文の基本的な書き方から、実際の流れ、二重ループ、for文の省略形、breakとの組み合わせまで、やさしく丁寧に解説していきます。
サンプルプログラムも、内容を少しアレンジしながら、動きがつかみやすい形で紹介します。

for文は決まった流れで繰り返す構文

for文は、一定の条件を満たす間、同じ処理を繰り返すための構文です。
特に、回数がある程度はっきりしている繰り返しに向いています。

基本の書式は次のようになります。

for (初期化式; 条件式; 増分式) {
    繰り返したい処理
}

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

項目役割
初期化式ループの開始前に1回だけ実行されるi = 1
条件式繰り返しを続けるかどうかを判定するi <= 5
増分式1回の処理が終わるたびに実行されるi++

for文では、まず初期化式が実行されます。
そのあと条件式が調べられ、条件が成り立っていれば中括弧の中の処理が実行されます。
処理が終わると増分式が実行され、再び条件式を調べます。これを条件が成り立たなくなるまで繰り返します。

この流れをしっかり理解しておくと、for文の動きがかなり分かりやすくなります。

図:for文の基本構造

この図から分かること

この図から分かるのは、for文がただ同じ処理を繰り返すだけではなく、開始の準備、続ける条件、値の更新という3つの要素で成り立っていることです。

特に大事なのは、初期化式は最初の1回だけ、条件式は毎回の繰り返し前、増分式は毎回の処理のあとに実行されるという順番です。
この順番を意識できるようになると、for文の動きがかなりイメージしやすくなります。

最初のサンプルでfor文の動きをつかもう

まずは、for文の基本的な動きを確認しやすいサンプルを見てみましょう。
ここでは、2、4、6、8、10 の合計を求めるプログラムを扱います。

プロジェクト/ファイル名: Lesson25_1/main.c

#include <stdio.h>

int main(void) {
    int i, sum = 0;

    // 1から5まで繰り返し、2倍した値を合計する
    for (i = 1; i <= 5; i++) {
        sum += i * 2;
    }

    printf("2, 4, 6, 8, 10 の合計は%dです。\n", sum);

    return 0;
}

実行結果

2, 4, 6, 8, 10 の合計は30です。

このプログラムでは、変数 i を 1 から 5 まで 1 ずつ増やしながら、i * 2 の値を sum に加えていきます。

処理の流れを1回ずつ追ってみると、次のようになります。

i の値加算される値sum の値
122
246
3612
4820
51030

このように、for文は繰り返しのたびに i の値を変えながら、決まった処理を何度も実行します。

for文の実行順序をもう少し詳しく見てみよう

このサンプルの for 文は、次のようになっています。

for (i = 1; i <= 5; i++) {
    sum += i * 2;
}

この1行には、繰り返しに必要な情報がまとまっています。

初期化式

i = 1

これは、for文が始まる前に1回だけ実行されます。
ここで i の最初の値を 1 にしています。

条件式

i <= 5

これは、繰り返しを続けるかどうかを判断する式です。
i が 5 以下である間はループを続けます。i が 6 になった時点で条件が成り立たなくなり、ループを終了します。

増分式

i++

これは、1回の処理が終わるごとに i を 1 増やす処理です。
つまり、i は 1、2、3、4、5 と変化していきます。

図:for文の実行の流れ

この図から分かること

この図から分かるのは、for文が毎回同じ順番で動いていることです。
最初に初期化を行い、そのあと条件を確認し、条件を満たしていれば処理を実行し、最後に値を更新してまた条件判定へ戻ります。

この順番を理解すると、どのタイミングで変数の値が変わるのか、なぜ決まった回数だけ繰り返されるのかが見えてきます。
for文が苦手に感じるときは、この流れを1周ずつ確認するのがとても効果的です。

for文は表示・集計・規則的な処理に向いている

for文は、同じような処理を何回も繰り返す場面に向いています。
よく使われる場面を挙げると、次のようになります。

用途
数を順番に表示する1から10まで表示する
合計を求める1から100までの合計を計算する
一定回数だけ処理するあいさつを5回表示する
表のように並べるマス目や座標を出力する
配列を順番に調べる配列の全要素を確認する

つまり、順番に進む番号や回数を使って処理する場面では、for文がとても使いやすいです。

for文の中にfor文を書くと二重ループになる

for文は1つだけでなく、その中にさらにfor文を書くこともできます。
これを二重ループ、またはネストしたループと呼びます。

二重ループは、行と列を扱う処理や、表形式の表示、座標の組み合わせなどでよく使われます。

次のサンプルでは、行番号と列番号を並べた表を表示します。

プロジェクト/ファイル名: Lesson25_2/main.c

#include <stdio.h>

int main(void) {
    int i, j;

    // 行と列を使って座標のような一覧を表示する
    for (i = 1; i <= 4; i++) {
        for (j = 1; j <= 5; j++) {
            printf("[%d,%d] ", i, j);
        }
        printf("\n");
    }

    return 0;
}

実行結果

[1,1] [1,2] [1,3] [1,4] [1,5]
[2,1] [2,2] [2,3] [2,4] [2,5]
[3,1] [3,2] [3,3] [3,4] [3,5]
[4,1] [4,2] [4,3] [4,4] [4,5]

このプログラムでは、外側の for 文が行を担当し、内側の for 文が列を担当しています。

  • 外側の i が 1 のとき、内側の j が 1 から 5 まで動く
  • 次に外側の i が 2 になり、また内側の j が 1 から 5 まで動く
  • これを i が 4 になるまで繰り返す

という流れです。

二重ループでは外側と内側の役割を分けて考える

二重ループを理解するときは、外側のループと内側のループの役割を分けて考えるのがコツです。

ループ役割
外側の for 文何行分繰り返すかを決める
内側の for 文1行の中で何回繰り返すかを決める

今回の例なら、外側が4行、内側が5列です。
そのため、4行5列のような並びになります。

最初は少しややこしく感じるかもしれませんが、内側のループは外側の1回分の中で全部動く、と考えると整理しやすくなります。

図:二重ループの動き

この図から分かること

この図から分かるのは、二重ループでは外側のループが大きなまとまりを作り、その中で内側のループが細かい繰り返しを担当していることです。

行と列、縦と横、親ループと子ループというように役割を分けて考えると、二重ループの動きがつかみやすくなります。
表の表示や配列の操作など、少し複雑な繰り返し処理を書くときにとても役立つ考え方です。

for文は一部を省略して書くこともできる

for文では、初期化式・条件式・増分式の一部、または全部を省略することもできます。

たとえば、次のような形です。

for (;;) {
    処理
}

この形では、初期化式も条件式も増分式も書かれていません。
条件式がないため、真とみなされて繰り返し続けることになります。つまり、無限ループです。

ただし、無限に繰り返してしまうとプログラムが終わらなくなるため、途中で break を使って抜けることがよくあります。

break と組み合わせると好きなタイミングで終了できる

break は、ループを途中で終了したいときに使う命令です。
for文の中で特定の条件になったら break を実行し、繰り返しを止めることができます。

次のサンプルでは、数値を入力し、9 が入力されるまで繰り返します。9 が入力されたら break でループを終了します。

プロジェクト/ファイル名: Lesson25_3/main.c

#include <stdio.h>

int main(void) {
    int n;

    // 9が入力されるまで処理を繰り返す
    for (;;) {
        printf("整数を入力してください(9で終了):");
        scanf("%d", &n);

        // 9が入力されたらループを終了する
        if (n == 9) {
            break;
        }

        // 入力された数の3倍を表示する
        printf("%dの3倍は%dです。\n", n, n * 3);
    }

    printf("繰り返しを終了しました。\n");

    return 0;
}

実行結果

整数を入力してください(9で終了):4
4の3倍は12です。
整数を入力してください(9で終了):7
7の3倍は21です。
整数を入力してください(9で終了):9
繰り返しを終了しました。

Visual Studioで scanf を使う場合は、これまでの学習内容と同様に、環境設定によって警告や実行時の注意が出ることがあります。学習用に動作確認するときは、設定も合わせて確認しておくと安心です。

省略形のfor文は便利だが使いどころが大切

for (;;) のような書き方は便利ですが、初心者のうちは少し分かりにくく感じることもあります。
そのため、基本の for 文に慣れるまでは、なるべく役割が見えやすい書き方を使うのがおすすめです。

書き方特徴
for (i = 1; i <= 5; i++)回数や流れが分かりやすい
for (;;)無限ループを作れるが、意図を説明する必要がある
break と併用条件によって途中終了できる
省略しすぎた書き方可読性が下がることがある

コードは動くだけでなく、読みやすいことも大切です。
特に学習段階では、後から見て分かりやすい書き方を意識すると理解が深まりやすくなります。

for文を書くときに意識したいポイント

for文を使うときは、次のポイントを意識するとミスを減らしやすくなります。

どこから始まるかを確認する

初期化式で、変数がどの値からスタートするのかを確認しましょう。
1から始めるのか、0から始めるのかで結果が変わることがあります。

どこまで繰り返すかを確認する

条件式をしっかり見ることが大切です。
i < 5 と i <= 5 では、繰り返し回数が変わります。

どう変化するかを確認する

増分式で、変数がどう変わるかを確認しましょう。
1ずつ増えるのか、2ずつ増えるのか、減っていくのかによってループの意味が変わります。

無限ループにならないか注意する

条件式がずっと真のままだったり、増分式が適切でなかったりすると、ループが終わらなくなることがあります。
break を使う場合も、どの条件で抜けるのかをはっきりさせることが大切です。

for文に慣れると繰り返し処理が一気に書きやすくなる

for文は、C言語の繰り返し処理の中心になるとても大事な構文です。
基本の形を理解しておくと、表示、集計、表の出力、二重ループ、途中終了のある処理など、さまざまなプログラムに応用できるようになります。

最初は、初期化式・条件式・増分式の役割をひとつずつ確かめながら読むのがおすすめです。
慣れてくると、for文を見ただけで、何回くらい繰り返すのか、どのように値が変わるのかが自然と分かるようになります。

基本の for 文をしっかり身につけておくと、今後学ぶ配列、文字列、表形式の処理などでも大きな力になります。
まずは短いサンプルから実際に入力して動かしながら、繰り返しの流れを自分の目で確かめていきましょう。