次のプログラムで x がゼロになるかどうか疑問に思っています。
考えてください:
int main ()
{
int x = 1;
while (x)
{
x <<= 1;
}
return 0;
}
このプログラムの予想される動作は、正常に終了するか、永久にループする必要がありますか?
x
どちらでも (または両方でも)、オーバーフロー時に未定義の動作で実行されます。
C99仕様セクション 6.5.7 は次のように述べています。
E1 << E2 の結果は、E1 左シフトされた E2 ビット位置です。空いたビットはゼロで埋められます。E1 が unsigned 型の場合、結果の値は E1 × 2 E2であり、結果の型で表現可能な最大値より 1 を法として減じられます。E1 が符号付きの型で負でない値を持ち、E1 × 2 E2が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は undefinedです。