繰り返し処理を行うfor文の書き方
for(フォー)文は繰り返し処理をするときに使う文。C言語では他にwhile文 や do/while文も繰り返し文として存在するがfor文で代替可能。またfor文は複雑な繰り返し文にも対応できる柔軟性がある。新しいプログラミング言語のGo言語ではwhile文とdo/while文は採用されていない。繰り返し文はfor文だけで問題ないことが分かる。
C言語ではカウントの役目を果たす int i; の宣言をfor文の継続条件式の中で出来ないため、外で宣言する。C++やJavaでは中で宣言可能。
基本的なfor文
#include <stdio.h>
int main(void) {
/* for 処理文を{}で囲む 一般的なスタイル */
int i; /* C言語はfor式の外で宣言 */
for (i=0;i<3;i++) {
printf("%d回目の処理\n",i+1);
}
return 0;
}
|
(i=0;i<3;i++)の中の説明
(カウントの初期化; ループ継続条件; カウントアップ)
i=0; カウントを初期化する。
i<3; iが3よりも小さい間、繰り返す。
i++ カウントアップ。まず継続条件内であれば、1回処理した後に i に 1 を加える。つまり1回目はi=0で実施し、2回目はi=1、3回目はi=2、4回目はi=3で継続条件を満たせないため、for文を抜けるという具合。実行結果は以下のようになる。
簡易的なfor文
#include <stdio.h>
int main(void) {
/* for 処理文が1行のときの簡易的な書き方 */
int i;
for (i=0;i<3;i++) printf("%d回目の処理\n",i+1);
return 0;
}
|
for文の継続条件式の後にある 1文;(セミコロン)までがループの範囲。上記例ではforから処理文まで1行で書かれているが、処理文を改行していても問題ない。セミコロン以降に処理文がある場合は、ループ外とみなされ、for文を抜けてから実行される。
処理文が複数ある場合のfor文
#include <stdio.h>
int main(void) {
int i;
for (i=0;i<3;i++) {
printf("%d回目の処理A\n",i+1);
printf("%d回目の処理B\n",i+1);
}
return 0;
}
|
複数の処理文があるときは{}で囲うことで、ループ内とみなされる。
1回目の処理A
1回目の処理B
2回目の処理A
2回目の処理B
3回目の処理A
3回目の処理B
|
for文の中でbreak文を使う
#include <stdio.h>
int main(void) {
/* for if break 何回処理するか予想できないとき */
int i;
int a = 1;
for (i=0;i<10;i++) {
a *= 2;
printf("%d回目の処理 a=%d\n",i+1,a);
if (a>=256) {
printf("break a>=256で抜ける\n",i+1);
break;
}
}
return 0;
}
|
break文は強制的にブロックから抜けることができる。for文の中で使うことで、ある条件になったときにfor文から抜けることができる。この例では2のべき乗を計算して、256以上になったら抜けるfor文。while文の代替のような使い方ができる。
1回目の処理 a=2
2回目の処理 a=4
3回目の処理 a=8
4回目の処理 a=16
5回目の処理 a=32
6回目の処理 a=64
7回目の処理 a=128
8回目の処理 a=256
break a>=256で抜ける
|
for文の中でcontinue文を使う
#include <stdio.h>
int main(void) {
/* for if continue 奇数と偶数で処理を変える例 */
int i;
for (i=0;i<10;i++) {
if (i%2==0) {
printf("%d回目 奇数回目の処理 continue\n",i+1);
continue;
}
printf("%d回目 偶数回目の処理\n",i+1);
}
return 0;
}
|
continue文は強制的にブロックの先頭位置に戻すことができる。この例ではfor文の中にcontinueを使うことで、奇数と偶数で別の処理をすることができる。他にも様々な応用が考えられる。
1回目 奇数回目の処理 continue
2回目 偶数回目の処理
3回目 奇数回目の処理 continue
4回目 偶数回目の処理
5回目 奇数回目の処理 continue
6回目 偶数回目の処理
7回目 奇数回目の処理 continue
8回目 偶数回目の処理
9回目 奇数回目の処理 continue
10回目 偶数回目の処理 |
継続条件式の省略 whileの代替
#include <stdio.h>
int main(void) {
/* while文の代替 */
int i=10;
for (;i>0;) {
printf("カウントダウン %d\n",i);
i--;
}
return 0;
}
|
while文は条件を満たしている間繰り返し処理をするというもの。ファイルの読み込みなど、回数指定が出来ない場合に使う。forで実現する場合、いろいろ方法はあるが、上記では継続条件式のカウント部を省略して、条件だけ指定することで、それっぽくしている。
カウントダウン 10
カウントダウン 9
カウントダウン 8
カウントダウン 7
カウントダウン 6
カウントダウン 5
カウントダウン 4
カウントダウン 3
カウントダウン 2
カウントダウン 1 |
do whileの代替
#include <stdio.h>
int main(void) {
/* do while文の代替 */
int a = 11;
int i = 1;
for (;;) {
printf("%d回通過 a=%d\n",i,a);
i++;
a++;
if (a < 10) continue;
else break;
}
printf("%d回実行して終了\n",i-1);
/* 素直な do while文の例 */
a=11;
i=1;
do {
printf("%d回通過 a=%d\n",i,a);
i++;
a++;
} while (a < 10);
printf("%d回実行して終了\n",i-1);
return 0;
}
|
do while文は条件を満たしていなくても一度は通過させる文。条件を満たしていれば、その間繰り返し処理となる。forで書く場合はいくつか方法が考えられるが、上記では継続条件式を省略して、continueとbreakを使ってdo whileの真似をしてみた。本来は下の例のようにbreakだけで事足りる。
1回通過 a=11
1回実行して終了
1回通過 a=11
1回実行して終了 |
継続条件式をすべて省略
#include <stdio.h>
int main(void) {
int i=10;
int j=1;
for (;;) {
if(i<1)break;
printf("%d回目の処理 i= %d\n",j,i);
j++;
i--;
}
return 0;
}
|
継続条件式をすべて省略することも可能。無限ループになるので、基本的に抜け出す方法が必要になる。
1回目の処理 i= 10
2回目の処理 i= 9
3回目の処理 i= 8
4回目の処理 i= 7
5回目の処理 i= 6
6回目の処理 i= 5
7回目の処理 i= 4
8回目の処理 i= 3
9回目の処理 i= 2
10回目の処理 i= 1 |
C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら