网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月28日漏签0天
c语言吧 关注:798,876贴子:4,357,336
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 12回复贴,共1页
<<返回c语言吧
>0< 加载中...

函数式宏后面一定要带括号吗?如图这个叻?

  • 只看楼主
  • 收藏

  • 回复
  • 恹花辞树
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

我这个阴影部分没有括号起来,但运行也很OK(这一组代码毕竟简单吧)
影响与否,它们有什么原理吗?


  • adjd
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
函 数 式
原来你说的是这个.jpg
---------------------------------
正经回答一下,C里面的宏是直接替换,这样一来就可能会出现一些问题,比如说
#define diff(x, y) (x) > (y) ? ( (x) - (y) ) : ( (y) - (x) )
diff(1, 2) + 3
这个会被展开为
1 > 2 ? ( 1 - 2 ) : ( 2 - 1) + 3
然而实际上你想要的应该是
( 1 > 2 ? ( 1 - 2 ) : ( 2 - 1) ) + 3


2025-07-28 07:31:08
广告
不感兴趣
开通SVIP免广告
  • 星尘喵
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
函 数 式
警觉
我大FP赛高!Haskell天下第一!
感谢楼上给我的启发
——————————————
正经回答
楼上说的很清楚了,宏是直接替换,不看当前语境的
我再举个例子:
你这个宏要实现的应该是abs(x-y)的作用
2+abs(1-0)是多少?是3。
abs(1-0)+2是多少?也是3。
所以说,你要实现的是这样的效果:2+diff(1,0)==diff(1,0)+2==3
如果你不加括号,2+diff(1,0)和diff(1,0)+2展开后分别是这样的:
2+(1)>(0)?((1)-(0)):((0)-(1))
(1)>(0)?((1)-(0)):((0)-(1))+2
再进一步简化一下的话:
第一个是2+1>0?1:-1,第二个是1>0?1:1。
第一个没毛病,结果是3;但是第二个就出问题了,结果是1。
如果加了括号呢?
2+((1)>(0)?((1)-(0)):((0)-(1)))和((1)>(0)?((1)-(0)):((0)-(1)))+2
括号里的内容永远是先算的,所以结果没有问题,都是3。
(PS.实际上如果x<y的话其实不加括号也能输出正确结果的。。)


  • 贴吧用户_aKJ5P9G
  • 酱油
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
函 数 式
警觉
我大OOP赛高,C#天下第一!
--------------
因为宏是直接替换,假如定义了宏
#define f(x) x*x
在一些情况会出现非预期的情况
例如 f(1+1)会被拆为1+1*1+1,这显然不是我们要得到的结果,因此加一个括号能有效避免这种情况。
此外,do{/*do something*/}while(0)也可以达到类似的效果,但其缺陷是不能在逗号表达式中使用


  • 唔唔啊啊啊啊
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
宏是个巨坑,别踩。建议用内联函数和常变量代替这种宏的使用


  • 热心网友来了
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
欢迎进来一起学习交流讨论


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 12回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示