宏定義中的括號和自增自減運算(1)

宏定義中容易引起許多運算優先級的問題,需要用括號加以約束

例如

#define abs(x) x>0?x:-x

abs(a-b);

abs(a)+1;

帶入展開後,結果如下:

a-b>0?a-b:-a-b;

a>0?a:-a+1;

以上兩個式子的運算優先級完全混亂。

因此需要在宏定義中將每個參數都用括號括起來+整個結果表達式也用括號括起來,如下:

#define abs(x) (((x)>0)?(x):-(x))


另外一個易錯的地方是,在宏調用的時候有++ 或者--運算

例如,

#define max(a,b) (((a)>(b))?(a):(b))

max(a,b++);

將宏定義帶入展開後

(((a)>(b++))?(a):(b++));

可以發現在上述表達式中b自增了兩次


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章