お役立ち情報

C言語のfor文の便利な使い方について

C言語のfor文・・・

for文は繰り返し処理の基本ロジックで、繰り返し処理はプログラミングにおいて条件分岐と並ぶ基本アルゴリズムです。繰り返し処理を自動化できるからこそプログラミングのメリットがあると言っても過言ではないでしょう。

人間が手動で何度も同じことをやるのは大変な場合、繰り返し処理を実装すればコンピューターが勝手に処理してくれます。そのため、for文はプログラミング学習者が最優先で習得したいアルゴリズムです。

変数やクラスの宣言等ももちろん最初に学びますが、アルゴリズムに関してはfor文が最初かもしれません。またfor文はほとんどのプログラミング言語使用されるコードなので、C言語で勉強しておけば言語が変わってもすぐに対応できます。

プログラミングにある程度慣れている人であれば、まったく知らない言語のソースコードを見てもfor文の処理内容は把握できるくらいです。またfor文に限った話ではありませんが、C言語をベースにプログラミングを学習するのは良いかと思います。

なぜなら、最近のプログラミング言語の比べてC言語は記述が簡略化されていないからです。C言語を先に学習すれば、他のプログラミング言語では理解した上で記述を簡略化することができます。

それでは、C言語のfor文について解説します。今回紹介する内容は少し応用編ですが、for文が初めての方でも理解できるよう丁寧に説明していきます。

二重ループの書き方

まずは二重ループのサンプルコードです。

#include <stdio.h>

int main(void) {
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            printf("i:%d,j:%d\n", i + 1, j + 1);
        }
    }
    return 0;
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

i:1,j:1
i:1,j:2
i:1,j:3
i:2,j:1
i:2,j:2
i:2,j:3
i:3,j:1
i:3,j:2
i:3,j:3

for文の構成は、(初期値;継続条件;インクリメント(増えていく)数)となっています。直感的にわかりやすいかと思います。

上の例だと初期値0から始まって、iが3になったタイミングでループを抜けます。インクリメントは「++」なのでiが1づつ増えていきます。二重目のjのfor文についても同様です。

次にループの内容ですが、iのループに入った直後にjのループに入り、jのループで初期値の0からj<3の条件を満たさなくなるまでjを加算していきます。そのため、iの値を変えないままjのループが3回回っています。

jが3回回ったら処理を抜けて、iに加算します。再びjのループに入り、3回回ります。3回回ったらまたjのループを抜けてiを加算します。このように、iのループのなかでjのループの処理が実行されるわけです。

理屈的には二重でなくても無限にfor文をネストさせていくことができるのですが、ネストし過ぎるとコードが見にくくなります。実際のシステム開発現場では、ネストは階層まで、といった規約が設けられている場合が多いでしょう。

無限ループの使い方

無限ループの書き方は簡単で、以下のようになります。

for (; ; ) {
    //処理内容
}

for文の構成は上で説明した通り、初期値、継続条件、インクリメント、となっていますが、何も指定しないとループは無限に続きます。実際のサンプルコードは以下です。

#include <stdio.h>

int main(void) {
    for(; ; ) {
    }
    printf("無限ループ\n");
    return 0;
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

無限ループ
無限ループ
無限ループ
無限ループ






このように、「無限ループ」という出力が無限に続きます。次に、以下のように記述すれば無限ループ処理のなかでもループを抜けることができます。

#include <stdio.h>

int main(void) {
    int i = 0;
    for(; ; ) {
        i++;
        if(i > 3) {
            break;
        }
        printf("%d回目の処理\n", i);
    }
    printf("処理終了\n");
    return 0;
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

1回目の処理
2回目の処理
3回目の処理
処理終了

for文は無限ループするように書いているのですが、中でiが3になったタイミングでbreakするように記述しています。

上記のコードだとfor文を無限ループにして中の条件文でbreakさせる理由が不明なのですが、たとえば特定の条件に合致したときのみbreakさせているような無限ループロジックは実際のシステムでも存在します。

continueで処理を飛ばす

breakだとループを抜けてしまうのですが、ループは抜けずに、条件に合致する間だけ処理を飛ばしたい場合もあるでしょう。そんなとき役立つのがcontinueです。continueを使ったサンプルコードは以下です。

#include <stdio.h>

int main(void) {
    for(int i = 0; i < 5; i++) {
        if(i + 1 < 3) {
            continue;
        }
        printf("%d回目の処理\n", i + 1);
    }
    printf("処理終了\n");
    return 0;
}

3回目の処理
4回目の処理
5回目の処理
処理終了

if文の条件に当てはまる間はcontinue句によって以降の処理が飛ばされています。そして、if文の条件に当てはまらなくなった3回目以降の処理は出力されています。

while文でのループ処理

ループ処理はfor文だけでなく、while文で記載することも可能です。具体的には以下のようになります。

#include <stdio.h>

int main(void) {
    int i = 0;
    while(i < 3) {
        printf("%d回目の処理\n", i + 1);
        i++;
    }
    printf("処理終了\n");
    return 0;
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

1回目の処理
2回目の処理
3回目の処理
処理終了

for文と違ってwhile文では継続、終了条件のみの記載となります。そのため、while文の前に初期値を設定し、while文のなかでインクリメント処理を行っています。状況にもよりますが、for文を使用した方が処理の記載がすっきりする場合が多いです。

for文で配列に処理を行う

配列はfor文との相性が良く、このセットで使用されることは多いです。サンプルコードを紹介します。

#include <stdio.h>

int main(void) {
    int array [5] = {0, 1, 2, 3, 4};
    for(int i = 0; i < 5; i++) {
        printf("%d,", array [i]);
    }
    return 0;
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

0,1,2,3,4

配列に5つの数字が入っていますが、for文を使用してすべて出力しました。ちなみに、継続条件を1<5としていますが、配列長さを取得する関数を使うケースが多いです。

上記のサンプルコードでは要素の出力を行っていますが、要素の書き換え、ループのなかで判定を行って条件に合致するもののに書き換える、といった処理を行うことも可能です。

他にもfor文のなかではいろいろな処理を実行することができますが、それについては徐々にレパートリーを増やしていくと良いかと思います。

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ