C語言基礎

#define SQUARE(x) x * x
int a = 3;
printf("%d\n", SQUARE(a + 1));

執行上方使用以 #define 定義之巨集 SQUARE 的程式碼時的輸出,下列何者正確?

  1. A7
  2. B10
  3. 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) 的值。巨集替換時不會補上括號。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 標頭檔 sensor.h 寫成上方的樣子。#ifndef、#define、#endif 這3行的目的,下列何者正確?
  2. 把上方程式碼寫在 main 函式中執行時的輸出,下列何者正確?
  3. 微控制器的輸出暫存器以上方的方式宣告並使用。關於這個宣告的說明,下列何者正確?
  4. 關於C語言標準所說的未定義行為,下列說明何者正確?
  5. int 與 unsigned int 為32位元。下列何者依C語言的標準屬於未定義行為?