1. 程式人生 > >寫一個“標準”巨集MIN,這個巨集輸入兩個引數並返回較小的一個。另外,當你寫下面的程式碼時會發生什麼事?least = MIN(*p++, b)

寫一個“標準”巨集MIN,這個巨集輸入兩個引數並返回較小的一個。另外,當你寫下面的程式碼時會發生什麼事?least = MIN(*p++, b)

#define MIN(A,B) ((A) <= (B) ? (A) : (B))
MIN(*p++, b)會產生巨集的副作用

剖析:

這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終歸不是函式,而巨集定義中括弧中的“引數”也不是真的引數,在巨集展開的時候對“引數”進行的是一對一的替換。程式設計師對巨集定義的使用要非常小心,特別要注意兩個問題:

(1) 謹慎地將巨集定義中的“引數”和整個巨集用用括弧括起來。所以,嚴格地講,下述解答:

#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )都應判0分;


(2) 防止巨集的副作用。

  巨集定義#define MIN(A,B) ((A) <= (B) ? (A) : (B))對MIN(*p++, b)的作用結果是:((*p++) <= (b) ? (*p++) : (b)) 這個表示式會產生副作用,指標p會作兩次++自增操作。除此之外,另一個應該判0分的解答是:#define MIN(A,B) ((A) <= (B) ? (A) : (B));
這個解答在巨集定義的後面加“;”,顯示編寫者對巨集的概念模糊不清,只能被無情地判0分並被面試官淘汰。