Q69.
某C 語言程式如下,下列敘述執行後結果何者正確?
數位電子 · 甲級 · 程式語言 · Q69
難易度分析
4 / 5
本題涉及 C 語言巨集展開與未定義行為的判斷,並要求考生同時確認多項答案,屬較高難度題型。
正確答案 (複選):①, ②, ③
- ① PR(SQUARE(A))=16:巨集展開為純文字替換,`SQUARE(A)` 展開為 `A*A`,當 A=4 時結果為 4*4=16,符合預期運算。
- ② PR(SQUARE(A+2))=14:巨集缺乏括號保護導致 `SQUARE(A+2)` 展開為 `A+2*A+2` 而非 `(A+2)*(A+2)`,依運算子優先順序計算為 4+8+2=14,此為經典巨集陷阱。
- ③ PR(SQUARE(++A))=30:`SQUARE(++A)` 展開為 `++A*++A`,遞增運算子在單一表達式中多次修改同一變數屬未定義行為 (Undefined Behavior),但常見編譯器會先兩次前置遞增使 A 變為 6,再以 5*6=30 計算。
錯誤選項解析
- ④ PR(SQUARE(++A))=25:此選項誤以為 `SQUARE(++A)` 會先將 A 遞增至 5 再計算 5*5=25,但巨集展開後 `++A*++A` 會導致 A 被遞增兩次,實際結果為 30 而非 25。
Learning Tip
"本題核心考點為 C 語言巨集展開機制與未定義行為。巨集僅做文字替換不進行數值計算,因此 `SQUARE(x)` 定義為 `x*x` 時,傳入 `A+2` 會展開成 `A+2*A+2` 而非 `(A+2)²`,正確寫法應使用 `#define SQUARE(x) ((x)*(x))` 加上括號保護。另外,在單一表達式中對同一變數執行多次 副作用運算 (如 ++A) 屬於未定義行為,實務上應避免此類寫法以確保程式可移植性。"
學員答題分佈
①PR(SQUARE(A))=160%
②PR(SQUARE(A+2))=140%
③PR(SQUARE(++A))=300%
④PR(SQUARE(++A))=250%
此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!