#define add(a,b) a+b

img

printf和cout为啥会输出不同的结果呢,求解惑
求解惑一下

知识点:
1.宏定义是完全替换的,使用到的地方需要将里面的数据完全替换到代码上
2.运算符优先级:先计算乘除加减,再计算 位移运算
所以:
第一种: 1<< 2 + 2 * 2 = 1<<6 = 64
第二种: cout<<1<<2 + 2 * 2 <<endl; 实际的是16.
另外给个小建议:代码中要是自定义函数,最好不要和系统定义的函数冲突呢.

add(1<<2,2) * 2相当于 1<<2 + 2 * 2
第一种: 1<< 2 + 2 * 2 = 1<<6 = 64
第二种: cout<<1<<2 + 2 * 2 <<endl; 实际输出1和6两个数字,所以是16
==================
要改为:
#define add(a,b) ((a) + (b))

因为#define 是直接替换代码

add(1<<2,2)*2  不是先计算add(1<<2,2)的结果再*2
而且直接把add(1<<2,2)*2 替换成 1<<2+2*2
1<<2+2*2  表达式是先计算2*2 = 4
变成1<<2+4 = 1<<6  = 64
而 cout<< add(1<<2,2)*2 <<endl; 
会替换成 
 cout<< 1<<2+2*2 <<endl; 
在 cout 之后的<< 会变为输出流运算符, 输出1 和 2+2*2的结果6

应该改成
#define add(a,b) ((a) + (b))

替换 
cout<< ((1<<2)+(2))*2 <<endl; 
就没有问题了

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632