用#define实现宏,求最大值和最小值

Lyyadd 2019-04-17 08:48:00
为什么要三个括号呢???????
...全文
776 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2019-04-18
  • 打赏
  • 举报
回复
加括号是为了避免外部调用时出现的运算顺序与预期不符 比如MAX(x+y,z)、MAX(x,y)+MAX(x,y) 不加括号都会出现问题
puthon 2019-04-18
  • 打赏
  • 举报
回复
可以看一下下面的代码运行结果:

#include<stdio.h>
//
#define MAX(x,y) x > y ? x : y//不加括号
#define MAXB(x,y) (x > y ? x : y)//加上括号
int main(){
    printf("%d\n",MAX(3,4) + MAX(5,6));//输出结果是5【错误】
    printf("%d\n",MAXB(3,4) + MAXB(5,6));//输出结果是10【正确】
    return 0;
}
不加括号的方式做两个取最大值操作的话,会发现得到错误的答案,具体可以尝试将宏定义在使用的地方展开加以分析:MAX(3,4)+MAX(5,6)展开即为(这里采用x1=3、y1=4、x2=5、y2=6方便说明):x1 > y1 ? x1 : y1 + x2 > y2 ? x2 : y2 1- 首先第一步执行(用红色标出):x1 > y1 ? x1 : y1 + x2 > y2 ? x2 : y2==(得到)==》y1 + x2 > y2 ? x2 : y2; 2- 然而当我们再往下执行y1 + x2 > y2 ? x2 : y2的时候发现y1+x2 = 10 > y2 = 6,所以返回的是x2 = 5; 3- 当然啦,加上括号就相当于限制了运算优先级,答案正确。 可以看出再使用宏的时候,涉及到宏函数的实现最好是加上函数主体部分的括号,防止因为函数调用等原因导致结果出现错误!
marwi_study 2019-04-17
  • 打赏
  • 举报
回复
你可以理解为define的格式是这样的,就是 #define 方法名 方法体 其实不用这么多括号也是可以的,这里是为了更加清晰地看出各个参数
ToF君 2019-04-17
  • 打赏
  • 举报
回复
宏的定义是替换,如果不加括号,容易跟别的东西混淆,容易产生错误

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧