15

以下がエラーにならないのはなぜですか?

for (int i=0; i<10; ++i) // outer loop
{
    for (int i=0; i<10;++i) // inner loop
    {
    //...do something
    }
//...do something else
}

私が理解しているように、中括弧 ({...}) 内の変数は、これらの中括弧内でのみ有効です。しかし、内側のループは外側のループの中かっこの内側にあります。int i=0内部ループを宣言するとすぐに、複数の定義に関するエラーが発生するのではないでしょうか?

4

5 に答える 5

17

実際には、別の変数と同じ名前の新しい変数を作成しています。それらは異なるスコープにあるため、これが許可され、内部スコープの変数が名前を「所有」します。内側のスコープ内の外側のスコープにアクセスすることはできませんi

for ループの宣言自体は for ループのスコープの一部であるため、2 番目の の場合は inner-scope の一部としてカウントされiます。

于 2010-03-06T17:46:24.573 に答える
3

2 番目のスコープは { } 中括弧内のみであるため、C++ コンパイラはこれを有効なものとして受け入れます。C で同じものを実装すると、次のようなエラーが表示されます。

$ gcc test.c
test.c: In function ‘main’:
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode

これは、ほとんどの C 方言では違法です。これは正当な C++ 宣言であるため、C++ コンパイラで C をコンパイルしている場合は受け入れられる可能性があります。

for( int i=0; i<5; ++i){}

C++ ではループのスコープ内にのみループ イテレータを配置するのが一般的ですが、C では (特に C99 ではなく C90 を使用して) 宣言がループのスコープ外にあることを確認します。それが役立つことを願っています... :-)

そのため、古いループ内で別の FOR ループを宣言すると、スコープが新たに開始され、コードは C++ または C99 でエラーなしでコンパイルされます。これは、スコープ宣言の通常受け入れられている基準です。

于 2010-03-07T01:53:13.773 に答える
2

これを理解する最善の方法は、for ループをその for ループの括弧の内側にあると宣言するときに、( と ) の間のすべてについて考えることです。少なくとも、スコープに関連しています。

これを理解するために、 x 変数が宣言されていない関数を考えてみましょう。内部の次のコードでエラーが発生します。(また、グローバルに定義された x 変数が他にないことも前提としています。)

for (int x = 0; x < 10; x++)
{
    something();
}
x++; // error, x is not defined.
于 2010-03-06T17:51:36.080 に答える
1

内側のループはスコープの別のレベルを開始します。 for ループはループ定義でスコープを開始するため、2 番目の i は新しいスコープになります。

見る

http://en.wikibooks.org/wiki/C%2B%2B_Programming/Scope#Scope_using_other_control_structures

于 2010-03-06T17:50:30.480 に答える
-2

ARE YOU SURE YOU DON'T GET AN ERROR WHILE EXECUTING THIS ....?

you are trying to define the two int variable within the same boundary .due to this this will generate the error . in c# if u try out the same code you will get the error

Error 1 A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else

于 2010-03-07T09:36:07.680 に答える