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 が unsigned 型の場合、結果の値は E1 × 2 E2であり、結果の型で表現可能な最大値より 1 を法として減じられます。E1 が符号付きの型で負でない値を持ち、E1 × 2 E2が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は undefinedです。

于 2012-07-11T21:11:16.570 に答える