C++重新声明循环计数变量的不一致行为
C++ redeclaration of loop count variable inconsistent behaviour?
我在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;
}
编译器抱怨重新定义,因为现在有两个具有相同名称、相同数据类型和相同作用域的变量。
至于为什么第二段代码会编译-编译器错误。它完全取决于编译器的实现;如果您更改优化级别,它可能不再显示。
- 大于65535的C++数组[size]引发不一致的溢出
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- 在头文件中定义变量不会出错
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 为什么我的数组值与此处的全局变量不匹配?
- 静态成员变量不会由 gettext 转换
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 变量中的数据不一致
- C++重新声明循环计数变量的不一致行为
- 不一致的警告:变量可能会被“longjmp”或“vfork”破坏
- 未初始化的布尔变量不一致
- 存储在具有相同积分部分的两个变量中的值不一致
- c++中不一致的文件作用域变量行为