ここで、int型の変数 i の有効範囲(スコープ)に関して、 プログラミング言語 C++ 第3版の「6.3.3.1 for文のなかでの宣言」によれば、 「(for文の)初期設定部が宣言になっている場合、そこで導入された変数は、 for-statementの末尾までのスコープを持つ」ということで、 for文の終わりまでが有効な変数ということになる。for (int i = 0; i < N; i++) a[i] = b[i] + c[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++言語では時期によって微妙に仕様が異なる場合がたまにある
ので、気を付けること。