#define max(a,b) ((a) > (b) ? (a) : (b))的问题

jjjjyyyyy 2005-10-24 12:59:14
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
别人的文章中看到的,增加几次是怎么发生的,应怎么理解啊?
请老师指导,不胜感谢!

...全文
2449 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
maojun1986 2005-12-20
  • 打赏
  • 举报
回复
学习...
sinall 2005-12-19
  • 打赏
  • 举报
回复
总之,分析的时候,你把你的语句用宏替换掉;转成普通语句就OK了。
Tycool 2005-12-19
  • 打赏
  • 举报
回复
注意这种macro的使用。
cunsh 2005-12-19
  • 打赏
  • 举报
回复
inline
shu_yoyo 2005-12-18
  • 打赏
  • 举报
回复
是这样的,,,好像是effectiv c++上的问题。
zhousqy 2005-12-18
  • 打赏
  • 举报
回复
都说了,LZ只要把参数代进去看看就知道了。
Mr_Yang 2005-12-18
  • 打赏
  • 举报
回复
都说完了,只能学习了。
zhujiujun 2005-12-18
  • 打赏
  • 举报
回复
up
doway 2005-10-24
  • 打赏
  • 举报
回复
根宏一点关系都没有,正确的写法:

a++;
max(a, b);
jixingzhong 2005-10-24
  • 打赏
  • 举报
回复
恩, 楼上说的正确!

用 宏定义 带来的问题之一就是这个问题了 ...

如果用的是模板, 就不会出现这种情况了 !! 建议使用模板 !!
寻开心 2005-10-24
  • 打赏
  • 举报
回复
#define max(a,b) ((a) > (b) ? (a) : (b))
这是宏定义, 实际编译器在遇到这个max的定义的时候,自动用展开后编译的
展开的时候,用a和b的表达式直接替换内容的

以 max(++a, b) 为例子,实际编译器处理的就是
(++a>b)? ++a:b;
所以++a在实际使用的时候是被多次调用的

把宏定义,改成模板方式可以解决这个问题,保证只调用一次++操作
snowbirdfly 2005-10-24
  • 打赏
  • 举报
回复
int a = 5, b = 0;
max(++a, b);
代入 #define max(a,b) ((a) > (b) ? (a) : (b))
就是((++a) > (b)) ? (++a):(b)
++a = 6 > 0,所以执行++a,所以a加了2次
max(++a, b+10)
代入#define max(a,b) ((a) > (b) ? (a) : (b))
就是((++a) > (b+10)) ? (++a):(b+10)
由于++a = 6 > 10?所以执行b + 10,a 的值只增加了1次
qfeng_zhao 2005-10-24
  • 打赏
  • 举报
回复
max(++a, b);// a 的值增加了2次
宏展开就是:
((++a) > (b) ? (++a) : (b))
因为++a>b为true, 所以其值为前一项即:++a,所以a共加了2次

max(++a, b+10); // a 的值只增加了1次
(++a) > (b+10)为false,所以其值取后一项,即b,忽略了前一项++a所以a共计算一次

65,186

社区成员

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

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