2012/04/23

C言語 for文

繰り返し処理を行う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文を抜けるという具合。実行結果は以下のようになる。
1回目の処理
2回目の処理
3回目の処理


簡易的な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文を抜けてから実行される。
1回目の処理
2回目の処理
3回目の処理


処理文が複数ある場合の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 目次はこちら