【问题标题】:C++ redeclaration of loop count variable inconsistent behaviour?C ++重新声明循环计数变量不一致的行为?
【发布时间】:2013-12-09 21:27:17
【问题描述】:

我在 Visual Studio 2010 中使用 C++ 并发现了一些奇怪的行为。长话短说,我发现这不会编译:

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

这似乎是正确的,因为变量 i 已经在 for 循环头中声明了。

现在,但是,如果我在重新声明 i 之前插入另一个 for 循环,那么突然编译器、智能感知等认为代码是正确的 - 没有给出真正的警告(尝试警告级别 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

【问题讨论】:

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


【解决方案1】:

根据标准规范:

1 ... for-init-statement 中声明的名称与条件中声明的名称在同一声明区域中

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

4 在 for-init-statement、for-range-declaration 和 if、while、for 和 switch 语句的条件中声明的名称对于 if、while、for 或 switch 语句(包括受控语句)是局部的, 并且不得在该语句的后续条件中或受控语句的最外层块(或者,对于 if 语句,任何最外层块)中重新声明 [§3.3.3]

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

【讨论】:

  • 另见this answer 到一个有点相关的问题(与您的解释一致)
【解决方案2】:

当你做类似的事情时:

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

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

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

编译器抱怨重新定义,因为您现在有 2 个具有相同名称、相同数据类型和相同范围的变量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2021-02-13
    • 2018-10-13
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多