LONGEPASS
電腦軟體設計(C++)/C++/Q23
中等
正確率 -
Q23.

若C 程式巨集(macro)定義如下,程式執行結束後之結果為何?電腦軟體設計(C++) 乙級 C++ 第 23 題 題目 第一張圖片 電腦軟體設計(C++) 乙級 C++ 第 23 題 題目 第二張圖片

電腦軟體設計(C++) · 乙級 · C++ · Q23

難易度分析

3 / 5

本題考查巨集展開的純文字替換機制以及運算子優先順序的影響。由於巨集在展開時不會像函式一樣先計算參數值,且定義中缺乏括號保護,因此計算過程會產生與直覺不同的結果,具有一定的陷阱性。

正確答案:①ans1=12, ans2=23

① ans1=12, ans2=23:巨集展開不帶括號時會受運算子優先順序影響:`ans1=10*sum(1,2)` 展開為 `10*1+2`,依優先順序計算為 `(10*1)+2=12`;`ans2=prod(3+4,5)` 展開為 `3+4*5`,計算為 `3+(4*5)=23`。

錯誤選項解析

  • ② ans1=12, ans2=35:ans1=12 正確,但 ans2=35 錯誤。此選項誤以為 `prod(3+4,5)` 會先計算 `3+4=7` 再乘 5 得 35,忽略了巨集純文字替換的特性,實際展開為 `3+4*5=23`。
  • ③ ans1=30, ans2=23:ans1=30 錯誤,此選項假設 `sum(1,2)` 會先加總得 3 再乘 10 得 30,但巨集展開後為 `10*1+2=12`。ans2=23 雖數值正確,但整體選項因 ans1 錯誤而不成立。
  • ④ ans1=30, ans2=35:ans1=30 與 ans2=35 均錯誤。此選項完全忽略了巨集展開無括號保護的問題,誤將巨集呼叫當作函式呼叫處理,導致兩個計算結果皆不符合實際展開後的運算順序。
Learning Tip

"巨集 (macro) 是前置處理器的純文字替換機制,不同於函式呼叫,不會先計算參數值。本題核心考點在於 `#define sum(a,b) a+b` 與 `#define prod(a,b) a*b` 的定義未加括號,展開後會受 `*` 優先於 `+` 的規則影響。正確寫法應為 `#define sum(a,b) ((a)+(b))` 與 `#define prod(a,b) ((a)*(b))` 以避免優先順序錯誤。常考陷阱是混淆巨集展開與函式呼叫的求值時機。"

學員答題分佈

①ans1=12, ans2=230%
②ans1=12, ans2=350%
③ans1=30, ans2=230%
④ans1=30, ans2=350%

此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!

相似類型題目