編譯器

在C語言中,有號整數的溢位是未定義行為。在此前提下,對上方函式進行最佳化的編譯器可能產生的程式碼,下列何者正確?

int f(int x) {
    return x + 1 > x;
}
  1. A一定保留比較指令,使其只在 x 為最大值時回傳0
  2. B替換為恆回傳1的程式碼
  3. C因為含有未定義行為,所以中止編譯並報錯
查看答案與解析

正確答案:B. 替換為恆回傳1的程式碼

有號整數的溢位是未定義行為,因此編譯器可以假設「正確的程式中不會發生溢位」。在這個假設下,x + 1 恆大於 x,所以可以省略比較,改成恆回傳1的程式碼。期待 x 為最大值時回傳0的程式碼,可能會因為這項最佳化而無法如預期運作。未定義行為在多數情況下不會在編譯時被偵測到,也不會報錯。

  • A. 前提是不會溢位,所以不需要保留比較。
  • B. 正確。以不會溢位為前提,可以判斷恆為真。
  • C. 未定義行為在多數情況下不會造成編譯時的錯誤。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 在程式的錯誤中,下列何者能在編譯時就被發現?
  2. 在具靜態型別的語言中,編譯器進行型別檢查的主要優點為何?
  3. 在詞法分析中,常用來表示辨識token之規則的是下列何者?
  4. 下列何者是用來表示許多程式語言的文法、並成為語法分析之基礎的文法種類?
  5. 運算式 2 + 3 * 4 的抽象語法樹之形狀,下列何者正確?

這個領域的比較