宏帶來的反作用

#define MIN(A,B) (A)<(B) ? (A) :(B);
bool aa = 3 < MIN(2,3);
#define MIN(A,B) ((A)<(B) ? (A) :(B));
bool bb = 3 < MIN(2,3);

上面代碼自己的意圖是,將3與2,3的較小者進行大小比較。aa,bb的指望的值應該是false。可是上面代碼的結果卻並不是如此(真實狀況:aa=true,bb=false)。注意第一段代碼與第二段代碼的區別在於,第二段代碼將整個宏用括號括起來了,做爲一個總體,而第一個則沒有。code

究竟是爲何呢?咱們將宏直接替換的規則,代碼被替換以下:class

[1] bool aa = 3 < 2 < 3 ? 2:3;
[2] bool bb = 3 < (2<3?2:3);

顯然bb與正常想法一致,很好理解。[1]中,根據小於號的左結合原則,先計算3<2 結果爲false(被看成0)再參與接下來的計算即,co

aa = 0<3?2:3;

結果爲2,被轉換爲bool型時,aa=true。這就是緣由所在,若是將aa的類型改變爲int,能夠發現aa的最終值爲2。足以證實分析結果。

p.s:這個問題是在刷POJ過程當中定義了宏被WA掉後發現的,因此在使用宏的時候特別要注意其所帶來的反作用。

相關文章
相關標籤/搜索