我正在使用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
,那么为什么它会出现错误&#34;未声明的标识符&#34;?
另一个例子是
for(int i = 0; i < 10; i++)
{
m_Var1++;
}
for(i = 0; i < 200; i++)//This line errors undeclared identifier
{
m_Var2++;
}
即使在for循环中声明了代码错误,但为什么呢?有没有办法做到这一点,而不必在循环之前声明i
但在循环中声明它,而不是像上面的例子中那样?
答案 0 :(得分: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,
答案 1 :(得分:3)
我记得,一些非常早期版本的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实际上有一个选项来启用旧的行为;您可以在配置属性 - &gt;下关闭“For Loop Scope中的强制一致性”。 C / C ++ - &gt;语言。相应的编译器命令行选项为/Zc:forScope-
。但除非你特别需要这个来编译你无法修复的旧代码,否则我强烈建议保留默认设置,这符合现代C ++规则。如果您正在编写新代码,请遵循现代C ++规则。如果你需要一个变量在循环外可见,那么在循环之外声明它。
答案 2 :(得分:2)
因为你在循环中声明它所以一旦循环结束,你的j
变量就超出了范围。在for语句中声明变量时,如此
for(int i = 0, j = 0; i < 10; i++)
变量只有循环范围。
答案 3 :(得分:1)
我已在
j
循环中声明for
...
是的,你有。并且你只能在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
和j
限制在特定的小区域,但允许j
从if
语句中“逃脱”。
答案 4 :(得分:0)
c ++使用该变量的块范围 - msdn docs