我在Visual Studio 2010中做C ++并发现了一些奇怪的行为。长话短说,我发现这不会编译:
for (int i = 0; i < 10; i++)
{
int i = 11;
}
这似乎是正确的,因为变量i已在for循环标头中声明。
现在,但是如果我在重新声明i之前插入另一个for循环,那么突然编译器,intellisense等代码是正确的 - 没有给出真正的警告(尝试警告级别3和4(/ W3和/) W4))。所以,这样做实际上将编译并运行:
for (int i = 0; i < 10; i++)
{
for(int j = 0; j < 5; j++)
{
}
int i = 11;
}
就我个人而言,我觉得奇怪的是,在另一个for循环中使用其他相同的代码场景是合法的。 任何善良的精神都能告诉我我在这里俯瞰什么?
提前致谢!
修改 哇,谢谢大家的所有回复和演示 - 你太棒了! :) 这个揭露错误的样本确实让我想到了,我只是假设MS现在已经注意到这样的事情并修复它......至少在VS2013中。
尝试按照建议更改优化设置,但没有任何区别。
谢谢大家!
演示信用:@Mark Garcia
答案 0 :(得分:19)
根据标准规范:
1 ...在for-init-statement中声明的名称与条件中声明的名称在同一个声明区域中
3 如果for-init-statement是声明,则声明的名称范围将扩展到for语句的末尾。 [§6.5.3]
和
4 在for-init-statement,for-range-declaration以及if,while,for和switch语句的条件中声明的名称是if,while,for或switch语句的本地语句(包括受控语句) ,并且不得在该陈述的后续条件中,也不得在受控陈述的最外层(或if语句,任何最外层)中重新宣布[§3.3.3]
MSVC ++ 2010的行为不是标准的,这是一个错误。
答案 1 :(得分:0)
当您执行以下操作时:
for (int i = 0; i < 10; i++)
{
//some code
}
您正在声明变量i并将其范围限制为for代码块。所以它只会在for循环中可见。 考虑到这一点,您的第一个代码片段重新定义了变量i;
for (int i = 0; i < 10; i++)
{
int i;
}
编译器抱怨重新定义,因为您现在有2个具有相同名称,相同数据类型和相同范围的变量。
至于为什么第二段代码编译-compiler bug。它完全取决于编译器的实现;如果您更改优化级别,它可能不再显示。