C言語 for文を上手に使いこなす3つの場面

  • このエントリーをはてなブックマークに追加
Pocket

C言語で同じを繰り返して実行させる場合、for文かwhile文を使うことになります。
まぁ、同じ処理を書いてもいいんですが、プログラムが読みにくくなりますよね。

では、for文を使うのか、while文を使うのかっていうことですが、ぶっちゃけ、どっちでもいいです。個人的にはwhile文のほうがちょっと面倒かなと思うので、for文を使うことが多いです。

もちろん、場面によっては当然while文も使います。ここでは、for文を上手に 使っていく方法を解説していきます。

繰り返し回数が決まっているものはfor文で記述するべし

繰り返し回数が決まっているのなら、for文のほうが書きやすいし、一目で繰り返し回数がわかるので、プログラムが読みやすくなると思います。

short i;
short loop_num = 100;

for (i = 0; i < loop_num; i++) {
    printf("i = %d\n", i);
}

こう書かれていると、どうですか?

iが0から1つずつ増やして、99になるまで繰り返すというのが、一目でわかりますよね?

しかし、while文で書くとこうなります。

short i;
short loop_num = 100;

i = 0;
while (i < loop_num) {
    printf("i = %d\n", i);
    i++;
}

これだけの処理なら、そんなに大差ないでしょうが、繰り返しの処理が膨大になった場合、i++の部分がwhile文の最後のほうに記述されることが多いため、繰り返し回数がわかりにくくなります。

それに、iの初期化忘れ、i++の記述忘れが発生したとき、正常に処理が働かなくなります。
とくにi++の記述忘れは無限ループになってしまうので、それだけは絶対に避けなければなりません。

そういう意味でも、繰り返し回数が決まっているなら、for文で書くことをお勧めします。

繰り返しが入れ子になるときはfor文で記述するべし

繰り返しが入れ子とはどういうことかというと、for文の中にfor文があるということです。
while文の中にwhile文で入れ子構造にできるでしょうが、先ほど書いたミスがwhile文には起こりやすいので、入れ子にするのなら、for文のほうがいいと思います。

しかし、あなたが、while文のほうがいいというのなら、それでかまいません。

short i, j;
short loop_num_i = 100;
short loop_num_j = 20;
short data[20][100];

for (j = 0; j < loop_num_j; j++) {
    for (i = 0; i < loop_num_i; i++) {
        data[j][i] = j * loop_num_i + i;
    }
}

data[20][100]というのは、2次元配列です。2次元配列についてはここでは解説しません。このdata配列に通し番号を代入しているだけのものです。

for文が入れ子になっているのがわかると思います。

これをwhile文にすると、

short i, j;
short loop_num_i = 100;
short loop_num_j = 20;
short data[20][100];

j = 0;
while (j < loop_num_j) {
    i = 0;
    while (i < loop_num_i) {
        data[j][i] = j * loop_num_i + i;
        i++;
    }
    j++;
}

こんな風になります。簡単な処理でも、少し複雑に見えますね。
これが3重になる場合もあるわけです。

また、内側のfor文で実行させる処理と外側のfor文で処理させるものが膨大になると、ますます複雑になるのがおわかりいただけると思います。

繰り返しの中にcontinue文を使用する場合はfor文で記述すべし

continue文は以降の処理を実行せずに、繰り返し文のはじめに戻る命令です。
continue文を記述するようなことがあるのなら、for文で記述するべきです。

なぜなら、while文ではcontinueする前に繰り返し条件を検討する必要があるからです。もし、検討しなければ、無限ループになってしまう可能性があります。

まずは、for文で書いたプログラムです。

short i;
short loop_num = 100;

for (i = 0; i < loop_num; i++) {
    if (i % 2 == 0) {
        continue;
    }
    printf("i = %d\n", i);
}

iを2で割ったあまりが0、要するにiが偶数だったら、何もせずにfor文の最初に戻ります。for文ではiが一つ増えますので、このfor文は100回実行したら抜けます。

一方、while文で書いた場合はどうでしょう。
あなたは、間違いに気づきますか?

short i;
short loop_num = 100;

i = 0;
while (i < loop_num) {
    if (i % 2 == 0) {
        continue;
    }
    printf("i = %d\n", i);
    i++;
}

この処理は永久にwhile文を抜けることはありません。なぜなら、最初のif文でiが偶数なら、while文の最初に戻るのはわかりますね。

しかし、iは値が増えることなく、同じiの値でwhile文実行の比較が行われてしまいます。
これを修正すると、このようになります。

short i;
short loop_num = 100;

i = 0;
while (i < loop_num) {
    if (i % 2 == 0) {
        i++;
        continue;
    }
    printf("i = %d\n", i);
    i++;
}

continueする前にiの値を増やしておく必要があります。こうしておくと、さきほどのfor文と同じ結果が得られるはずです。

このようなことにならないためにも、continue文を使うときはfor文で記述するようにしましょう。

まとめ

for文の上手な使い方を3つ紹介しました。

絶対for文を使わないといけないということもありませんが、

・繰り返し回数が決まっている
・入れ子にする必要がある
・continue文が必要である

という場合は、for文で記述したほうが、プログラムの間違いを防ぐ可能性があがりますよ。ということなので、あなたがどんなときでもwhile文がいいというなら、それでかまいません。

プログラムを作っていくうえで、あなたが一人ですべての作業(作成、テスト、メンテナンス)をこなすのであれば、あなたが作りやすいように作ればいいです。

しかし、あなた以外の人が、プログラムを読んだり、メンテナンスをしたりする可能性があるのなら、ある程度の可読性も意識して、プログラムを書いていく必要があります。

したがって、ケースバイケースで、よりよいプログラムを書けるように経験を積んでいくことが大切です。

  • このエントリーをはてなブックマークに追加

コメントを残す

*