編譯器
對上方函式充分進行常數傳播、常數摺疊與無用程式碼刪除後,函式所回傳的值與剩餘的程式碼,下列何者正確?
int h(void) {
int a = 5;
int b = a * 3;
int c = b - a;
if (c > 100) return 0;
return c * 2;
}
- A恆回傳20,if敘述的判斷被刪除
- B恆回傳0,return c * 2 被刪除
- 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. 全部由常數決定,所以不會殘留執行時的計算。