#include <stdio.h>
#define M(x,y) x-y
#define num b-c
#define unn (b-c)
main()
{
int a=4,b=3,c=5;
printf("%d",a*M(b,c)); //a*x-y=4*3-5=7 M(b,c)相当于x-y这个式子,并非这个式子计算后的值
putchar('\n');
printf("%d",a*num); //num就相当于b-c这个式子,所以a*b-c
putchar('\n');
printf("%d",a*(num));//在num外面加一层括号,可以使得a*(b-c)
putchar('\n');
printf("%d",a*unn);//在宏定义里面直接给式子加括号,可以使得a*(b-c)
}
在这道题中,很多人会认为printf("%d",a*M(b,c))输出的结果是4*(3-5)=-8,当然我也一样。实际上这是错误的。宏定义只是简单的符号替换,而不做其他处理。所以M(b,c)只将式子b-c传递过去,并不是算完结果后再传递过去的,并且式子并没有带括号,这时候我们也不需要为这个式子画蛇添足,不能为这个式子添加多余的括号。这种情况多在试卷上出现,的确有些容易让学生犯错。
运行结果:
我们再来看看这道题
#include <stdio.h>
#define S(a,b) a*b
int main(void)
{
int n = 3;
int m = 5;
printf("%d",S(n+m,m+n));
return 0;
}
可不要把答案再想成(3+5)*(3+5)=64了,这明显是错误答案。
而正确的思路是:n+m*m+n,接着把值代入,一定不要加括号!
正解:3+5*5+3=3+25+3=31