forループを記述する上で生ずる疑問点と誤り

1.forループのカウンタ変数をループ内で変更したらどうなるか

forループでは繰返し毎に増加する変数の役割を「カウンタ変数」に分類している。次の例では変数「i」がカウンタ変数である。
もしカウンタ変数をループ内部で変更したらどのようになるのか調べてみよう。

List 1 ループ途中でカウンタ変数iを変更しているプログラム

public class XXXX {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
   
    XXXX() {
        int i;
        for (i=0;i<10;i++) {
            System.out.printf("hello i=%d\n",i);
            i++;
        }
    }
}

実行結果
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++) {
        printf("hello i=%d\n",i);
        i--;
    }

 

2.forループが複数個順番に並んだ時に,カウンタ変数はループの数だけ必要か

次のプログラムでは3つのforループが順番に実行されます。ループごとに異なるカウンタ変数を用意しています。

List 2 ループの数だけカウンタ変数を用意しているプログラム

public class XXXX {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
   
    XXXX() {
        int i,j,k;
        for (i=0;i<3;i++) {
            System.out.printf("hello i=%d\n",i);
        }
        for (j=0;j<3;j++) {
            System.out.printf("bonjour j=%d\n",j);
        }
        for (k=0;k<3;k++) {
            System.out.printf("tag k=%d\n",k);
        }
    }
}

実行結果
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 {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
   
    XXXX() {
        int i;
        for (i=0;i<3;i++) {
            System.out.printf("hello i=%d\n",i);
        }
        for (i=0;i<3;i++) {
            System.out.printf("bonjour i=%d\n",i);
        }
        for (i=0;i<3;i++) {
            System.out.printf("tag i=%d\n",i);
        }
    }
}

実行結果
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 {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
   
    XXXX() {
        int i;
        for (i=0;i<3;i++) {
            System.out.printf("hello i=%d\n",i);
            for (i=0;i<3;i++) {
                System.out.printf("bonjour i=%d\n",i);
            }
        }
    }
}

実行結果
hello i=0
bonjour i=0
bonjour i=1
bonjour i=2

しかしList4では内側のループ終了時にiの値は3になってしまうため,外側のループの継続判断の時にi<3が偽になるため,外側のループは3回繰り返さず,1回で終ってしまう。
そこで,List5のように内側と外側のforループのカウンタ変数を別なものにするとこの問題は解決する。

List 5 別なカウンタ変数を二重ループで使用しているプログラム

public class XXXX {
    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