編譯器
在C語言中,有號整數的溢位是未定義行為。在此前提下,對上方函式進行最佳化的編譯器可能產生的程式碼,下列何者正確?
int f(int x) {
return x + 1 > x;
}
- A一定保留比較指令,使其只在 x 為最大值時回傳0
- B替換為恆回傳1的程式碼
- C因為含有未定義行為,所以中止編譯並報錯
查看答案與解析
正確答案:B. 替換為恆回傳1的程式碼
有號整數的溢位是未定義行為,因此編譯器可以假設「正確的程式中不會發生溢位」。在這個假設下,x + 1 恆大於 x,所以可以省略比較,改成恆回傳1的程式碼。期待 x 為最大值時回傳0的程式碼,可能會因為這項最佳化而無法如預期運作。未定義行為在多數情況下不會在編譯時被偵測到,也不會報錯。
- A. 前提是不會溢位,所以不需要保留比較。
- B. 正確。以不會溢位為前提,可以判斷恆為真。
- C. 未定義行為在多數情況下不會造成編譯時的錯誤。