A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cp1454298677 中级黑马   /  2014-10-1 20:01  /  1501 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

定义宏   #define  MAX(a,b)     ((a) > (b) ? (a):(b)   )
  当   int   a = 4 ;  int  b = 5 ;
调用 宏   int   c = MAX(++a , ++b);     这时  c  等于 7 ,而不是 6     
问题   如何 写宏  定义   让   MAX(++a,++b)    得到   正确 的 答案

11 个回复

倒序浏览
我觉得是编译器优化的原因,把++改正+1

test.png (168.24 KB, 下载次数: 20)

test.png
回复 使用道具 举报
alpha.huai 发表于 2014-10-1 21:36
我觉得是编译器优化的原因,把++改正+1

不需要  a+1  就是  要 ++a  来实现  ,  关键在于 如何 更改宏定义 即使是 ++a  也能 能到 像 a+ 1 答案
回复 使用道具 举报
你非要用++a来实现,这种情况是没办法避免的。
下面给你分析下产生这种情况的原因,宏定义说白了就是内容的替换。
MAX(++a , ++b); 替换成(++a) >  (++b) ? (++a) : (++b)
现在不用我说lz也应该晓得为什么会是7了吧,b加了两次,要说到避免这种情况的话,尽量的传参时不要涉及++、--这种操作。
回复 使用道具 举报
lyan 发表于 2014-10-1 23:53
你非要用++a来实现,这种情况是没办法避免的。
下面给你分析下产生这种情况的原因,宏定义说白了就是内容的 ...

您说得对 , 以上 宏定义 , 如果使用++a 来实现 是没法避免 出现问题 。 所以 楼主 就想 有哪位 大神 能有一种更加 完美的 宏定义 来 避免 这种 错误的 或者 不小心的 宏调用 而 引发的 一系列问题。。。
回复 使用道具 举报
能不能换种写法,就是达到同一效果的不同方法
回复 使用道具 举报
王绍明 发表于 2014-10-2 10:06
能不能换种写法,就是达到同一效果的不同方法

对 , 就是想换一种  宏定义 的写法  , 但是 不知道 怎么 写? 所以 问题 就是  怎么写 宏 , 能 避免 因为调用 ++a  而 引发的 一系列 问题。。。
回复 使用道具 举报
a>b?a-1:b-1;
回复 使用道具 举报
alpha.huai 发表于 2014-10-1 21:36
我觉得是编译器优化的原因,把++改正+1

我去~++a>++b?++a:++b;:funk:
回复 使用道具 举报
//没有必要纠结像这样自增自减的问题,不同的编译器的实现不一样,比如
int a,b=0;
(a=b)=b++;
//谁能确定这个执行完了之后a是什么,b又是什么呢?因为第二个等号左右的执行顺序是不确定的,至少C++标准里没有规定,很多的程序设计语言都有各自的缺陷,我们要做的是去了解这些缺陷,然后避免这些缺陷,而不是非要去较真这些无所谓的东西,有这样的精力去研究一下算法导论才涨姿势
回复 使用道具 举报
易孟飞 发表于 2014-10-3 03:11
//没有必要纠结像这样自增自减的问题,不同的编译器的实现不一样,比如
int a,b=0;
(a=b)=b++;

试下  这种 宏 定义

#define  MAX(type , a ,b) {  type -a = a ; type _b  = b ; _a>_b?_a:_b;}
不过  有些 编译器 不能 在 宏中  定义 ,   gcc 编译器 可以
回复 使用道具 举报
alpha.huai 发表于 2014-10-2 23:27
我去~++a>++b?++a:++b;

我试过  我电脑 的编译器 并没有 把 ++a  变为 a+1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马