我想知道x在以下程序中是否会达到零。
请考虑:
int main ()
{
int x = 1;
while (x)
{
x <<= 1;
}
return 0;
}
此程序的预期行为是正常退出还是永远循环?
答案 0 :(得分:18)
当x
溢出时,它都没有(或两者)运行在未定义的行为中。
C99规范6.5.7节说:
E1的结果&lt;&lt; E2是E1左移E2位位置;腾出的位用零填充。如果E1具有无符号类型,则结果的值为E1×2 E2 ,比结果类型中可表示的最大值减少一个模数。如果E1有签名 类型和非负值,E1×2 E2 在结果类型中可表示,那么这就是结果值; 否则,行为未定义。