5-1 for文(ループ)

同じ処理の繰り返しが必要な場合に使用します。
繰り返し処理の書き方は複数ありますが、ここではfor文の使い方を説明します。
また、繰り返し実行することをループと言います。

for文基本

for文の書き方は以下となります。

for (初期化式;条件式;更新式)
    実行する処理;

(初期化式)
for文はまず最初に初期化式を一度だけ実行します。

(条件式)
判定結果が真の場合に「実行する処理」を実行します。

(更新式)
「実行する処理」の実行が終わると変化式が実行されます。

サンプルを見てみましょう。

int i;
for(i=0; i<3; i++)
	printf("%d回目のループです\n", i + 1);

説明します。

(初期化式)
最初に i=0 を実行します。

(条件式)
i<3 の場合には、「実行する処理」である printf文を実行します。
i=3 は実行されません。

(更新式)
printf文の実行が終わったら、i++ を実行します。
i=0 の実行が終わったら、i++が実行されて i=1 になります。
ですから、このfor文では i=0 i=1 j=2 のときにprintf文が実行されます。

以下が実行結果です。

#include <stdio.h>

int main()
{
int i;
    for(i=0; i<3; i++)
        printf("%d回目のループです\n", i + 1);
}
実行結果
0回目のループです
1回目のループです
2回目のループです

次の例を見てください。

for(int i=0; i<3; i++) {
	printf("%d回目のループです\n", i + 1);
}

forのカッコ内で変数を宣言すると、その変数はfor文の中でのみ使用できます。
for文の{}が終了すると、その変数は使用できなくなります。

次の例は複数の文を実行する例です。

#include <stdio.h>

int main()
{
int a;
    for(a=2; a<=10; a+=2) { /* a+=2 は a=a+2 と同じ */
        printf("a=%d\n", a);
        printf(" これは偶数です\n");
    }
}
実行結果
a=2
↑これは偶数です
a=4
↑これは偶数です
a=6
↑これは偶数です
a=8
↑これは偶数です
a=10
↑これは偶数です

下のような書き方になります。

for (初期化式;条件式;更新式)
  実行する処理;
  実行する処理;
  実行する処理;
}

for文2重ループ

2重ループの使い方です。3重、4重も同様です。

#include <stdio.h>

int main()
{
    for (int x=1; x<=3; x++) {
        for (int y=10; y<=30; y+=10) {
            printf("x=%d y=%d x+y=%d\n", x, y, x+y);
        }
    }
}
実行結果
x=1 y=10 x+y=11
x=1 y=20 x+y=21
x=1 y=30 x+y=31
x=2 y=10 x+y=12
x=2 y=20 x+y=22
x=2 y=30 x+y=32
x=3 y=10 x+y=13
x=3 y=20 x+y=23
x=3 y=30 x+y=33

for文無限ループ

無限ループの使い方は以下の書き方です。

for (;;) {
    実行する処理;
}

初期化式、条件式、更新式がすべてありません。これは無限ループです。
このままではプログラムが永遠に終了しないため、次に説明するbreakによって終了させます。

break文

break文はfor文の実行を中止します。

#include <stdio.h>

int main()
{
    int i=0;

    for (;;) {
        i++;
        if(i >= 3) {
            printf("終了します\n");
            break;
        }
        printf("for %d回目の処理\n", i);
    }
    printf("処理が終了しました\n");
}
実行結果
for 1回目の処理
for 2回目の処理
終了します
処理が終了しました

この使い方は、for文を実行する時点では何回繰り返すか分からない場合です。
for文内で何らかの処理を行ったときに、終了条件が判明したらbreakで終了するということです。
上の例では、 i>=3 で break して、for文を抜け出ます。

continue文

continue文は処理をスキップします。
次の例を見てください。

#include <stdio.h>

int main()
{
    for (int i = 0; i < 5; i++) {
        printf("i for文の下 i=%d です\n", i);
        if(i<2) {
            /* 処理が不要なためスキップ */
            printf("continue文の前です\n");
            continue;
        }
        printf("if文の下 i=%d です\n", i);
    }
    printf("処理が終了しました \n");
}
実行結果
i for文の下 i=0 です
continue文の前です
i for文の下 i=1 です
continue文の前です
i for文の下 i=2 です
if文の下 i=2 です
i for文の下 i=3 です
if文の下 i=3 です
i for文の下 i=4 です
if文の下 i=4 です
処理が終了しました

この使い方は、for文の中で処理したくない、処理をスキップしたいという場合に
continue文を使ってスキップします。
continue文を実行すると、continue文の下方の文は処理をせずにfor文のすぐ下の行に行きます。
実行結果の出力をみてください。
if文の下 i=2 です
i=0, i=1の場合はこのprintfが無いことに注意してください。
スキップされています。

次の例を見てください。
2重ループの場合です。
この場合 continue するとどこに行くのでしょう。

int main()
{
    for (int k=0; k<2; k++) {
        printf("k for文の下 i=%d です\n", k);
        for (int i = 0; i < 4; i++) {
            printf("i for文の下 i=%d です\n", i);
            if(i<2) {
                /* 処理が不要なためスキップ */
                printf("continue文の前です\n");
                continue;
            }
            printf("if文の下 i=%d です\n", i);
        }
        printf("処理が終了しました k=%d \n", k);
    }
}
実行結果
k for文の下 i=0 です
i for文の下 i=0 です
continue文の前です
i for文の下 i=1 です
continue文の前です
i for文の下 i=2 です
if文の下 i=2 です
i for文の下 i=3 です
if文の下 i=3 です
処理が終了しました k=0
k for文の下 i=1 です
i for文の下 i=0 です
continue文の前です
i for文の下 i=1 です
continue文の前です
i for文の下 i=2 です
if文の下 i=2 です
i for文の下 i=3 です
if文の下 i=3 です
処理が終了しました k=1

continue を実行すると「i for文の下 i=1 です」に行きます。
2重ループの場合の continue は、自分の属している {} のfor文に戻ります。
break も同様です。

コメント

タイトルとURLをコピーしました