C ++重新声明循环计数变量不一致的行为?

时间:2013-11-25 08:54:03

标签: c++ visual-studio-2010 for-loop scope

我在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中。

尝试按照建议更改优化设置,但没有任何区别。

谢谢大家!

First piece of code

Second piece of code

演示信用:@Mark Garcia

2 个答案:

答案 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。它完全取决于编译器的实现;如果您更改优化级别,它可能不再显示。