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

C++ redeclaration of loop count variable inconsistent behaviour?

本文关键字:变量 不一致 循环 新声明 声明 C++      更新时间:2023-10-16

我在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循环会使原本相同的代码场景合法化。有什么好心的人能告诉我我在这里俯瞰着什么吗?

提前感谢!

编辑:哇,谢谢大家的回复和演示-你太棒了!:)我确实想到了这个暴露bug的示例,我只是认为MS现在已经注意到了这样的事情,并修复了它……至少在VS2013中是这样。

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

谢谢大家!

第一段代码

第二段代码

演示来源:@Mark Garcia

根据标准规范:

1。。。在for-init语句中声明的名称与在条件中声明的那些名称在同一声明性区域中

3如果for init语句是一个声明,则声明的名称的范围将扩展到for语句的末尾。[§6.5.3]

4在for init语句、for range声明以及if、while、for和switch语句条件下声明的名称是if、which、for或switch语句(包括受控语句)的本地名称,并且不应在该语句的后续条件中重新声明,也不应在受控语句的最外层块(或者,对于if语句,任何最外层块)中重新声明[§3.3.3]

MSVC++2010的行为不是标准的,这是一个错误

当您执行以下操作时:

 for (int i = 0; i < 10; i++)
    {
     //some code
    }

您正在声明变量i,并将其范围限制为for代码块。因此,它只能在for循环中可见。考虑到这一点,您的第一个代码片段重新定义了变量i;

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

编译器抱怨重新定义,因为现在有两个具有相同名称、相同数据类型和相同作用域的变量。

至于为什么第二段代码会编译-编译器错误。它完全取决于编译器的实现;如果您更改优化级别,它可能不再显示。