forループを記述する上で生ずる疑問点と誤り
1.forループのカウンタ変数をループ内で変更したらどうなるか
forループでは繰返し毎に増加する変数の役割を「カウンタ変数」に分類している。次の例では変数「i」がカウンタ変数である。
もしカウンタ変数をループ内部で変更したらどのようになるのか調べてみよう。
List 1 ループ途中でカウンタ変数iを変更しているプログラム |
#include <stdio.h> |
実行結果 |
hello i=0 hello i=2 hello i=4 hello i=6 hello i=8 |
このように,iの値は「for (i=0;i<10;i++) 」と「i++;」の2箇所でカウントアップされるため,2ずつ増加してゆく。
もし次のようになっていたら,一ループ中にi--とi++の両方が行なわれ,永久に終らないforループが出来てしまう。
for (i=0;i<10;i++)
{ |
2.forループが複数個順番に並んだ時に,カウンタ変数はループの数だけ必要か
次のプログラムでは3つのforループが順番に実行されます。ループごとに異なるカウンタ変数を用意しています。
List 2 ループの数だけカウンタ変数を用意しているプログラム |
#include <stdio.h> |
実行結果 |
hello i=0 hello i=1 hello i=2 bonjour j=0 bonjour j=1 bonjour j=2 tag k=0 tag k=1 tag k=2 |
プログラムList2は正常に動作しますが,ループを抜けた時点で,カウンタの役割は終えてしまいますので,次のループでは同じカウンタ変数を再利用することが出来ます。プログラムList3は同じカウンタ変数を再利用している例です。
当然ながらあるループのカウンタ変数がプログラム上の意味を持つ場合,その意味を表す別なカウンタ変数を使用することはよいことです。
List 3 カウンタ変数iを複数回再利用しているプログラム |
#include <stdio.h> |
実行結果 |
hello i=0 hello i=1 hello i=2 bonjour i=0 bonjour i=1 bonjour i=2 tag i=0 tag i=1 tag i=2 |
3.二重ループで,同じカウンタ変数を使用することは出来ない
List4では(「hello」を1回「bonjour」を3回表示する作業)を3回繰り返したいと考えています。
List 4 同じカウンタ変数iを二重ループで使用しているプログラム |
#include <stdio.h> |
実行結果 |
hello i=0 bonjour i=0 bonjour i=1 bonjour i=2 |
しかしList4では内側のループ終了時にiの値は3になってしまうため,外側のループの継続判断の時にi<3が偽になるため,外側のループは3回繰り返さず,1回で終ってしまう。
そこで,List5のように内側と外側のforループのカウンタ変数を別なものにするとこの問題は解決する。
#include <stdio.h>
List 5
同じカウンタ変数iを二重ループで使用しているプログラム
int main()
{
int
i,j;
for (i=0;i<3;i++)
{
printf("hello
i=%d\n",i);
for (j=0;j<3;j++)
{
printf("bonjour j=%d\n",j);
}
}
return
0;
}
実行結果
hello i=0
bonjour j=0
bonjour
j=1
bonjour j=2
hello i=1
bonjour j=0
bonjour j=1
bonjour
j=2
hello i=2
bonjour j=0
bonjour j=1
bonjour
j=2