【发布时间】:2013-11-10 17:01:37
【问题描述】:
我认为下面的C程序应该输出1:
#include <stdio.h>
int main()
{
unsigned int n=18u;
while ((n+17u)>=17u) n-=17u;
printf("%u\n",n+17u);
return 0;
}
但在VC6、Visual Studio 2010或Visual Studio 2012中编译,均处于发布模式,程序不输出任何内容,也不退出。
这是VS2012生成的汇编代码:
00BD1000 mov eax,12h
00BD1005 lea eax,[eax-11h]
00BD1008 jmp main+5h (0BD1005h)
看来编译器做了一些优化,生成了一个无限循环。
我认为((n+17u)>=17u) 并不总是正确的,因为如果n==0xFFFF..FF,n+17u 会换成16u。
是我错了,还是编译器错了?
【问题讨论】:
-
这可能是未定义的行为。 (我对 C 的了解不够好,无法确定)
-
我在VS2012中看到了。已在 VS2013 中修复。
-
@HansPassant 有任何链接可以确认吗?太吓人了。
-
在 VS2012 更新 4 中仍未修复。
标签: c visual-c++ unsigned