2

私の C++ 仕様の理解によると (ドラフト標準オンラインによると)、for ループは while ループと初期化用のブロックの観点から書き直すことができます。私の理解では、for ループの繰り返しステートメントは本体と同じスコープで発生するため、for ループの本体で宣言された変数を使用できるはずです。gcc と clang の両方が、次の (不自然な) コードを拒否します。これは、実際のコードを簡略化したものです。

ループの外で j を宣言することで明らかにコードを修正できますが、なぜ j は以下の範囲外なのでしょうか?

int main() 
{
    for(int i=0; i<10; i=j) int j=i+1;

    // // I must misunderstand the standard because I thought the above loop is 
    // // equivalent to the commented code below where j is clearly in scope.
    // {
    //     int i=0;
    //     while(i<10) {
    //         int j=i+1;
    //         i=j;
    //     }
    // }

    return 0;
 }

clang (および gcc) によると、これは無効です。

test.cpp:3:26: error: use of undeclared identifier 'j'
    for(int i=0; i<10; i=j) int j=i+1;
                         ^
1 error generated.
4

4 に答える 4

3
for(int i=0; i<10; i=j) int j=i+1;

有効な構文であれば、次のようになります。

for(int i=0; i<10; i=j) 
{
  int j=i+1;
}

{}次に、forループは、最初のループが実行されるまで存在しないスコープ内の「j」にアクセスします。C ++は静的言語であり、コンパイラーがコンパイル時に変数を解決できるかどうかに依存しますが、実行時に変数を解決しようとしています。

于 2012-07-11T05:02:04.383 に答える
1

参考までに、展開は次のとおりです(§6.5.3/1)。for ループ ステートメント:

for (init cond; expr) statement

次と同等です。

{
    init
    while (cond)
    {
        statement
        expr;
    }
}
于 2012-07-11T05:16:49.203 に答える
0

それはどういうわけか明白です。例を挙げましょう。このようなことを書いていただけますか?

int main(){
int i = j * 10;
//Some other lines ...
int j = 2;
return 0;
}

もちろん、与えられたコードでは、iとjは同じスコープにありますが、jを使用する前に、それを宣言する必要があります。
スコープ以外にも考慮する必要があります。

于 2012-07-11T05:02:26.983 に答える
0

エラーが発生する理由は、「j」が for ループ内で宣言/初期化されているためです。しかし、C++ コンパイラでは、左から右、上から下にコンパイルされるため、「i」にガベージ値が割り当てられていることにコンパイラが遭遇すると、エラーがポップアップ表示されます。

于 2012-07-11T05:21:55.427 に答える