黑马程序员技术交流社区

标题: 关于 c 语言 宏 [打印本页]

作者: cp1454298677    时间: 2014-10-1 20:01
标题: 关于 c 语言 宏
定义宏   #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)    得到   正确 的 答案
作者: alpha.huai    时间: 2014-10-1 21:36
我觉得是编译器优化的原因,把++改正+1

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

test.png

作者: cp1454298677    时间: 2014-10-1 22:19
alpha.huai 发表于 2014-10-1 21:36
我觉得是编译器优化的原因,把++改正+1

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

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

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

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

我试过  我电脑 的编译器 并没有 把 ++a  变为 a+1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2