for循环中的奇怪行为-一个bug
strange behavior in for loop - a bug?
我在Windows 7机器上使用Visual Studio 2012工作,当尝试运行以下代码片段(在x64模式下使用默认VC11 c++编译器编译)时,断言失败,这意味着,内部循环从未进入:
void loopTest1()
{
const unsigned int k = 1;
for (int m=0; m<3; ++m)
{
int acc = 0;
for (int n=m-k; n<=m+k; ++n)
{
if (n<0 || n>=3) continue;
++acc;
}
assert (acc>0);
cout << "acc: " << acc << endl;
}
}
现在我改变了内循环的结束条件:
void loopTest2()
{
const unsigned int k = 1;
for (int m=0; m<3; ++m)
{
int acc = 0;
int l = m+k; // this line was added
for (int n=m-k; n<=l; ++n) // m+k was replaced by l
{
if (n<0 || n>=3) continue;
++acc;
}
assert (acc>0);
cout << "acc: " << acc << endl;
}
}
然后我得到正确的结果:
acc: 2
acc: 3
acc: 2
当我用硬编码的1替换const unsigned int k
时,它也可以工作:
void loopTest3()
{
//const unsigned int k = 1;
for (int m=0; m<3; ++m)
{
int acc = 0;
for (int n=m-1; n<=m+1; ++n) //replaced k with 1
{
if (n<0 || n>=3) continue;
++acc;
}
assert (acc>0);
cout << "acc: " << acc << endl;
}
}
编译器执行一些错误的优化吗?或者有什么具体的原因,为什么第一种情况下的行为至少是出乎意料的?
您的int m
将被提升为unsigned int
。在第一个循环中,这意味着m-k
作为无符号值等于-1,这是最大的无符号值,明显大于m+k
(当比较n
时,它被提升)。从正确的角度来看,您最终会得到n
是-1的无符号表示,m+k
是1。当然,当您将无符号-1存储到有符号整数中时,它会溢出,并且在技术上是未定义的行为。它很可能保留了它的-1表示,然后被提升回最大无符号值。
以下是第一次迭代的分类总结:
迭代1:
m: 0
凯西:1 u
N =m-k: -1u = Max int,存储为signed int
m + k: 1 u
N<=m+k -> Max int <= 1u
在第二个示例中,n
与另一个有符号整数比较时没有提升,它比较两个有符号整数。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 我正在用 c++ 制作一个小时钟,但遇到了"bug"或某种问题
- 这个std::vector和std::shared_ptr内存泄漏是一个bug吗
- c++ 指向另一个类 bug "no operator matches these operands."的指针
- 奇怪的bug-子例程只运行一个cout
- 我用STL写了一个bin_search,但这是一个小BUG
- 在一个简单的策略模式的bug
- for循环中的奇怪行为-一个bug
- 可变模板元编程:clang++或g++中的一个bug
- 这是GCC中的一个bug吗?
- MSVC 2013 Bug?正在从映射的容器中检索最后一个元素
- 我最近在使用abs()时遇到了一个奇怪的bug
- libc++ std::search_n中的崩溃是一个bug吗?
- 在Qt中重现一个bug:调试代码时出现分段错误
- 这是g++中的一个bug吗?
- visual studio -这(崩溃)是VS2012 c++编译器中的一个bug吗?
- 一个非常简单的加法程序(c++)上的奇怪bug
- 这是Mac OS X 10.6 c++ std API中的一个bug吗?
- 调用mysql_close获取堆栈损坏,这是MySQL中的一个bug吗?