補足:for文の中での宣言

(初級編でも説明したが)
for文の初期化部で変数の宣言が行なえる。 例えば、以下のようなコードが書ける。
for (int i = 0; i < N; i++)
    a[i] = b[i] + c[i];
ここで、int型の変数 i の有効範囲(スコープ)に関して、 プログラミング言語 C++ 第3版の「6.3.3.1 for文のなかでの宣言」によれば、 「(for文の)初期設定部が宣言になっている場合、そこで導入された変数は、 for-statementの末尾までのスコープを持つ」ということで、 for文の終わりまでが有効な変数ということになる。
例えば以下のような場合、 for文が終わった後で変数 i を参照すると、有効範囲外であるので エラーとなる。
for (int i = 0; i < N; i++)
    if (a[i] == 0)
        break;
if (i == N)                    // この iはエラー (古い仕様ではOK)
    cout << "not found" << endl;

また、有効範囲がfor文の最後までなので、以下のコードは変数の二重定義で エラーということにはならず有効である。

for (int i = 0; i < N; i++)
    a[i] = b[i] + c[i];

for (int i = 0; i < N; i++)    // iは二重定義ではない (古い仕様では二重定義でエラー)
    b[i] -= c[i];

しかしながら、初期のC++言語の仕様では、for文が現れた以降(ブロックがお わるまで)有効であったため、上記コードは変数の二重定義でエラーとなって しまっていた。

本プロ演3にて使用しているC++コンパイラ環境である VC++6(今となっては古いバージョン)では、この古い仕様に従っているためか、 上記のような毎回for文の中で同じ変数を宣言している場合はエラーとなる。
このように、C++言語では時期によって微妙に仕様が異なる場合がたまにある ので、気を付けること。


文責:大津