long a = 0x80000000;
long b = 1;
if (a - b > 0) {
printf("hello");
} else {
printf("world");
}
これは、helloではなくworldが出力される事もある。
なぜかと言うと…
Cでは、signedの計算でオーバーフローした時の動作は、未定義。
そのためコンパイラは、「signedの計算はオーバーフローしない」と思って最適化をかける事がある。
コンパイラの最適化の結果、
a-b>0
が、a>b
に変換されると、以下のコードになる。
long a = 0x80000000;
long b = 1;
if (a > b) {
printf("hello");
} else {
printf("world");
}
この場合、aは負、bは正なので、worldが出力される事になる。
0 件のコメント:
コメントを投稿