我认为下面的 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
.
我错了,还是编译器错了?