編譯器

對上方函式充分進行常數傳播、常數摺疊與無用程式碼刪除後,函式所回傳的值與剩餘的程式碼,下列何者正確?

int h(void) {
    int a = 5;
    int b = a * 3;
    int c = b - a;
    if (c > 100) return 0;
    return c * 2;
}
  1. A恆回傳20,if敘述的判斷被刪除
  2. B恆回傳0,return c * 2 被刪除
  3. C計算全部保留,在執行時回傳20或0
查看答案與解析

正確答案:A. 恆回傳20,if敘述的判斷被刪除

傳播 a = 5 後,可摺疊為 b = 5 * 3 = 15、c = 15 − 5 = 10。如此一來,條件 c > 100 即 10 > 100,可知恆為假,所以 return 0 的分支就是絕不會執行的無用程式碼而被刪除。剩下的 return c * 2 為 10 × 2 = 20,函式就只剩下 return 20;。由於條件恆為假,所以不會回傳0,在執行時也不需要進行計算或判斷。

  • A. 正確。c = 10,條件恆為假,成為只回傳20的程式碼。
  • B. 條件恆為假,所以不會回傳0。
  • C. 全部由常數決定,所以不會殘留執行時的計算。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 關於編譯器詞法分析的作用,下列何者正確?
  2. 關於編譯器的語法分析所進行的工作,下列何者正確?
  3. 下列何者最適合作為編譯器的語意分析所能發現的錯誤範例?
  4. 關於抽象語法樹(AST)的特徵,下列何者正確?
  5. 編譯器內部使用不依賴來源語言、也不依賴CPU的中介表示(IR),其主要優點為何?

這個領域的比較