宏定义的边缘效应

偶尔善良 提交于 2020-01-01 01:24:56
#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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!