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

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

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

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

#include <stdio.h>

int main()
{
    int i;
    for (i=0;i<10;i++) {
        printf("hello i=%d\n",i);
        i++;
    }
    return 0;
}

実行結果
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 ループの数だけカウンタ変数を用意しているプログラム

#include <stdio.h>

int main()
{
    int i,j,k;
    for (i=0;i<3;i++) {
        printf("hello i=%d\n",i);
    }
    for (j=0;j<3;j++) {
        printf("bonjour j=%d\n",j);
    }
    for (k=0;k<3;k++) {
        printf("tag k=%d\n",k);
    }
    return 0;
}

実行結果
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>

int main()
{
    int i;
    for (i=0;i<3;i++) {
        printf("hello i=%d\n",i);
    }
    for (i=0;i<3;i++) {
        printf("bonjour i=%d\n",i);
    }
    for (i=0;i<3;i++) {
        printf("tag i=%d\n",i);
    }
    return 0;
}

実行結果
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>

int main()
{
    int i;
    for (i=0;i<3;i++) {
        printf("hello i=%d\n",i);
        for (i=0;i<3;i++) {
            printf("bonjour i=%d\n",i);
        }
    }
    return 0;
}

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

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

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

#include <stdio.h>

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