1

私はVisual Studio 2010を使用していますが、次のようなことをすると

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

if(j == 0)//This line errors undeclared identifier
    DoSomething();

for ループで宣言jしたのに、「宣言されていない識別子」というエラーが発生するのはなぜですか?

別の例は

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

for(i = 0; i < 200; i++)//This line errors undeclared identifier
{
        m_Var2++;
}

forループで宣言されているにもかかわらず、そのコードはエラーになりますが、なぜですか? i上記の例のように、ループの前に宣言する代わりにループ内で宣言する必要なく、これを行う方法はありますか?

4

5 に答える 5

5

最初の例でjは、ループのスコープにのみ存在します

for(int i = 0, j = 0; i < 10; i++)
{
        if(m_Var == 1) j++;
}  // i, j exist no longer

2 番目の例では、同じことが にも当てはまりますi。そのスコープは最初のループです。ループなしでチェックすることもできます:

{
  int i = 0;
} // end of scope, end of i

i++; // error, 
于 2012-08-28T08:50:53.750 に答える
4

思い出したように、C++ の非常に初期のバージョンにはfor、ループを含むブロックにスコープが設定されたループで定義された変数がありました。最新の C++ では、スコープはforループ自体に制限されています。例えば:

void foo() {
    for (int i = 0; i < N; i ++) {
        // i is visible here
    }
    // In very old C++, i is visible here.
    // In modern C++, i is not visible here.
}

Visual Studio には、実際には古い動作を有効にするオプションがあります。[構成プロパティ] --> [C/C++] --> [言語] の下で、[For ループ スコープで適合を強制する] をオフにすることができます。対応するコンパイラ コマンド ライン オプションは/Zc:forScope-. ただし、修正する余裕がない古いコードをコンパイルするためにこれが特に必要でない限り、最新の C++ ルールに準拠するデフォルト設定のままにしておくことを強くお勧めします。新しいコードを作成する場合は、最新の C++ ルールに従ってください。変数をループの外側で見えるようにする必要がある場合は、ループの外側で宣言します。

于 2012-08-28T09:05:48.723 に答える
2

ループで宣言するため、ループが終了すると、j変数はスコープ外になります。このように for ステートメント内で変数を宣言すると、

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

変数にはループ スコープしかありません。

于 2012-08-28T08:51:00.583 に答える
1

私はループで宣言jしました...for

はいあなたが持っています。また、そのスコープはそのループの閉じ中かっこで終了するため、そのループでのみ使用できます。forそれ以降はご利用いただけません。

後でそれを使用したい場合は、スコープを少し外に移動する必要がありますが、他のものに影響を与えるほどではありません (ローカリゼーションはまだ良いことです)。1 つの方法は、次のようなブロック スコープを使用することです。

{
    int i, j;                          // Scope starts here,
    for (i = 0, j = 0; i < 10; i++)
        if (m_Var == 1)
            j++;
    if (j == 0)                        // still exists here,
        DoSomething();
}                                      // and ends here.

これはまだ特定の小さな領域に制限されていますが、ステートメントから「エスケープ」することがiできます。jjif

于 2012-08-28T08:51:56.290 に答える
0

C++ はその変数にブロック スコープを使用します - msdn docs

于 2012-08-28T08:51:46.713 に答える