王不财 2022-04-05 21:04 采纳率: 50%
浏览 88
已结题

#define add(a,b) a+b

img

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

  • 写回答

4条回答 默认 最新

  • 爱编程的大李子 Java领域新星创作者 2022-04-05 21:25
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • CSDN专家-link 2022-04-05 21:12
    关注

    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

    评论 编辑记录
  • 有问必答小助手 2022-04-05 21:30
    关注
    您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
    PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 4月5日

悬赏问题

  • ¥20 python 3des pyDes库
  • ¥15 关于#mysql#安装失败的问题。MySQL
  • ¥15 想问一下for循环计算表达式的方法,第一次接触
  • ¥15 如何在VA框架上面加功能,去读取框架内任何app数据功能
  • ¥15 关于#c语言#的问题:用c或c++写一个计算下列问题有关软件工程的代码并加上分析
  • ¥15 Zeppelin0.10.0版本升级lib包下的shiro-web
  • ¥15 链表入队的指针内存问题
  • ¥20 vba如何写本地html文件执行js
  • ¥15 VS2022的C#如何创建
  • ¥20 关于#用户注册#的问题,如何解决?