繰り返し処理 (forとwhile)

#include< stdio.h >
main()
{

  int i;

for(i=0; i<20; i++){

  /* 20回繰り返す。(iは0から19まで) */

    printf("i = %d\n", i);

  /* ここには、繰り返したい文をいくつも書くことができる */

}

}
まず、一番はじめに i=0 が実行されます。
次に i<20 を評価し、条件が成立していれば printf() を実行します。
それが終わると i++ を実行し、また i<20 の評価に移ります。
それが成立していれば、後は printf() => i++ => i<20 と、繰り返すことになります。
もちろん、i<20 が成立しなくなったら、for文は終了します。

forをwhileで書き換えると次のようになります。

#include< stdio.h >
main()
{

  int i;
i=0;

while(i < 20){

    /* i < 20が成立している間繰り返し */

    printf("i = %d\n", i);

    i++;

  }

}

最後に、do〜while文というのを見てみましょう。
#include< stdio.h >
main()
{

  int i=0;

  do{

    /* 条件式はループの最後に書く */

    printf("i = %d\n", i);

    i++;

  }while(i < 20);

}



for文の書式


for(式1 ; 条件式 ; 式2)

※ 式1 -> 条件式 -> 文 -> 式2 -> 条件式 -> ・・・ の順番


while文の書式


while(条件式)

※ 条件式 -> 文 -> 条件式 -> ・・・ の順番


do〜while文の書式



do

while(条件式);
※ 文 -> 条件式 -> 文 -> 条件式 -> ・・・ の順番



上の3つのプログラムは全く同じ動作をしています。

しかし、同じことをする文が2つも3つも存在することに意味があるのでしょうか?
実は、「動作は同じでも、それぞれの持っている意味(解釈)が違う」から意味があるのです。

for文は、「何回繰り返す」という意味合いで使いますが、while/do〜while文は、「条件が成立している間繰り返す」という意味合いを強く持っています。
これらの意味合いを使い分けられると、他人のソースコードを読むときに大変読みやすくなります。
とりあえずは、forとwhileを使えるようにしましょう。

ところで、do〜whileですが、何がwhileと違うかというと、do〜whileは、評価する条件式が文の後ろにあるから、条件がどうであろうと最低1回は命令を実行することになる、ということです。


break文



break文を使うと、ループの途中でもそのループを終了することができます。
使い方としてはswitch文中のbreak文と同じです(switchはループではない)。

goto文



gotoは便利なのですが、使用するときれいなプログラムが書けなくなり、他人が読む場合、非常に読みにくくなってしまいます。
gotoはできるだけ使用を避けたほうが良いでしょう。



補足



if文では条件が成立した場合に処理する命令を中カッコで囲んでいましたし、for文でも繰り返す命令を中カッコで囲みました。
しかし、この中カッコは省略できる場合があります。
その例を下に示します。

2つのif文はどちらも同じ この場合、中カッコは取り除けない for文の場合
  if(i != 0) printf("hello.\n");

  if(i != 0){
    printf("hello.\n");
  }

  for(i=0; i<10; i++){
    printf("%d >", i); /* 複数の文を扱うときは */
    scanf("%d", &p[i]); /* 中カッコで囲む */
  }

  for(i=0; i<10; i++) printf("\n");