#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分並被面試官淘汰。
正確的解法:
- #define MIN(a,b) ((a)>=(b)?(b):(a))
但是:
MIN(*p++,b)會產生副作用。
((*p++)>=(b)?(b):(*p++))這個表達式會使得指針p作2次自增操作。