解答:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) MIN(*p++, b)會產生宏副作用
剖析:這個面試題主要考察宏定義可以實現函數的功能。但是它終歸不是函數,宏定義中括弧的”參數“也不是真的參數,在宏展開的時候對”參數“進行的是一對一的替換。
C++中另一個進行代碼替換的是#inline,它們之間的區別是:
1. define只是簡單的宏替換,通常會產生二義性;而inline會真正地編譯到代碼中
2. inline函數是否展開由編譯器決定,有時候當函數太大時,編譯器可能選擇不展開相應的函數
程序員對宏定義的使用要非常小心,特別注意以下兩個問題:
(1)謹慎地將宏定義中的“參數”和整個宏虹括號括起來。所以嚴格地將講,下述解答#define MIN(A,B) (A) <= (B) ? (A) : (B) 以及 #define MIN(A,B) (A <= B ? A : B) 都是不對的。
(2)防止宏的副作用。宏定義#define MIN(A,B) ((A) <= (B) ? (A) : (B)) 對MIN(*p++, b)的作用結果是 ((*p++) <= (b) ? (*p++) : (*p++))這個表示式會產生副作用,指針p會作三次++自增操作
除此之外,另一個不好的解答是#define MIN(A,B) ((A) <= (B) ? (A) : (B));
這個解答在宏定義的后面加了“;“