C語言基礎
#define SQUARE(x) x * x
int a = 3;
printf("%d\n", SQUARE(a + 1));執行上方使用以 #define 定義之巨集 SQUARE 的程式碼時的輸出,下列何者正確?
- A7
- B10
- C16
查看答案與解析
正確答案:A. 7
巨集只是由前置處理器把文字原樣替換。SQUARE(a + 1) 會展開為 a + 1 * a + 1,乘法先計算,因此結果是 3 + 3 + 1 = 7。若要照意圖得到 (a + 1) 的平方16,應像 #define SQUARE(x) ((x) * (x)) 這樣用括號包住引數與整體。即使如此,像 SQUARE(i++) 這種有副作用的引數會使 i++ 被求值兩次而成為未定義行為,因此也可以改用行內函式。
- A. 正確。展開為 a + 1 * a + 1,3 + 3 + 1 = 7。
- B. 這是誤讀為 SQUARE(a) + 1,也就是 3 × 3 + 1 時的值。
- C. 這是 (a + 1) × (a + 1) 的值。巨集替換時不會補上括號。