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