宏定义中容易引起许多运算优先级的问题,需要用括号加以约束
例如
#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自增了两次