#include<stdio.h>
#define M(x) x*x
int main(){
printf("%d",M(1+2));
}
#include<stdio.h>
#define M(x) x+2
int main(){
printf("%d",M(3)*2);
}
如果是新手,若不小心,可能会判断错上面两段程序的输出结果吧。但又可能有人觉得是程序有问题,实际上,这叫做:宏定义的边缘效应。不过并不是一种错误。
那么,问题出在哪里呢?
#include<stdio.h>
#define M(x) (x)*(x)
int main(){
printf("%d",M(1+2));
}
#include<stdio.h>
#define M(x) (x+2)
int main(){
printf("%d",M(3)*2);
}
它们的输出应该和一般的设想是一致的。区别在哪里?察觉到了吗?
宏定义的功能是形式的替换,而不是值的替换!
#define M(x) x*x
不是说M(x)的值为x*x,而是将(x)的形式替换为x*x。
也就是说,M(1+2)=1+2*1+2=1+2+1*2=5。
来源:CSDN
作者:Lakersh
链接:https://blog.csdn.net/Lakersh/article/details/103752533