《算法笔记》第2章
例如,有如下宏定义。
#define ADD(a, b) ((a)+(b))
为什么不能写成#define ADD(a, b) a + b
或者#define ADD(a, b) (a + b)
?
实际上,必须加这么多括号是因为宏定义是直接将对应的部分替换,然后才进行编译和运行。
以下面的程序为例。
#include<stdio.h>
#define CAL(x) (x * 2 + 1)
int main(){
int a = 1;
printf("%d\n", CAL(a + 1));
return 0;
}
输出结果:4
为什么不是5
?实际上,宏定义把替换的部分直接原封不动替换进去,这里的CAL(a + 1)
实际上是(a + 1 * 2 + 1)
,得出的结果就是4
。
因此,尽量不要使用宏定义来做除了定义常量以外的事情,除非给能加的地方都加上括号。