forループを記述する上で生ずる疑問点と誤り
1.forループのカウンタ変数をループ内で変更したらどうなるか
forループでは繰返し毎に増加する変数の役割を「カウンタ変数」に分類している。次の例では変数「i」がカウンタ変数である。
もしカウンタ変数をループ内部で変更したらどのようになるのか調べてみよう。
List 1 ループ途中でカウンタ変数iを変更しているプログラム |
public class XXXX { |
実行結果 |
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 ループの数だけカウンタ変数を用意しているプログラム |
public class XXXX { |
実行結果 |
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を複数回再利用しているプログラム |
public class XXXX { |
実行結果 |
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.二重ループで,同じカウンタ変数を使用することは出来ない
二重のforループにおいて,内側ループと外側ループで同じカウンタ変数を使用することはできません。
List4では(「hello」を1回「bonjour」を3回表示する作業)を3回繰り返したいと考えています。
List 4 同じカウンタ変数iを二重ループで使用しているプログラム |
public class XXXX { |
実行結果 |
hello i=0 bonjour i=0 bonjour i=1 bonjour i=2 |
しかしList4では内側のループ終了時にiの値は3になってしまうため,外側のループの継続判断の時にi<3が偽になるため,外側のループは3回繰り返さず,1回で終ってしまう。
そこで,List5のように内側と外側のforループのカウンタ変数を別なものにするとこの問題は解決する。
public class XXXX {
List 5 別なカウンタ変数を二重ループで使用しているプログラム
public static void main(String[] args) {
XXXX mainprg = new XXXX();
}
XXXX() {
int i,k;
for (i=0;i<3;i++) {
System.out.printf("hello i=%d\n",i);
for (k=0;k<3;k++) {
System.out.printf("bonjour k=%d\n",k);
}
}
}
}
実行結果
hello i=0
bonjour k=0
bonjour k=1
bonjour k=2
hello i=1
bonjour k=0
bonjour k=1
bonjour k=2
hello i=2
bonjour k=0
bonjour k=1
bonjour k=2