9

我想知道在下面的程序中 x 是否会达到零。

请考虑:

int main ()
{
    int x = 1;
    while (x)
      {
        x <<= 1;
      }
    return 0;
}

该程序的预期行为应该正常退出还是永远循环?

4

1 回答 1

18

两者都不是(或两者),它在x溢出时以未定义的行为运行。

C99规范第 6.5.7 节说:

E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2 E2,比结果类型中可表示的最大值多模一减少。如果 E1 有带符号类型和非负值,并且 E1 × 2 E2在结果类型中是可表示的,那么这就是结果值;否则,行为是 undefined

于 2012-07-11T21:11:16.570 回答