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();

我已经j在 for 循环中声明了,为什么它会出错“未声明的标识符”?

另一个例子是

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

在第二个例子中,同样适用于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

我已经jfor循环中声明...

是的,你有。而且您只能在该循环中使用for,因为它的范围在该循环的右括号处结束。之后您将无法使用它。

如果你以后想使用它,你必须把范围移开一点,但不要太远,以免影响其他东西(本地化仍然是一件好事)。一种方法是使用块范围,例如:

{
    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 回答