请各位富翁回答一个关于c++的一个很菜的问题~!(20分)

  • 主题发起人 主题发起人 白衣书生
  • 开始时间 开始时间

白衣书生

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟菜鸟一个,偶尔学学c++,现在有如下源码:
#include <stdio.h>
#define max(a,b) ((a) > (b) ? (a) : (b))
main()
{ int a = 5, b = 0;
max(++a, b);
printf("% d",a);
max(++a, b+10);
printf ("%d",a);
getchar();
}
运行结果显示7和8,但是我按照源码分析,认为结果应是6和 7,怎么会变成7和8呢?
怎么多了一次?
而我把宏定义#define换成max(int a,int b){......} 函数时,结果会是6和7!
这个问题是否出在 #define max(a,b) ((a) > (b) ? (a) : (b))的宏定义上?
#define究竟怎么用才对?

小弟我一头雾水,请各位富翁点拨一下,多谢!
我的编译环境是turbo c++ ---
 
#define 可能在预编译的时候就已经+了一次
所以就你这个样的啦!
 
这可以是宏定义max(++a, b)会变为
(++a)>(b)? (++a):(b)这时因为++a>b 所以结果为++a(a加了两次)即a=7
(++a)>(b+10)? (++a):(b+10) 这时因为(++a)<(b+10),所以结果为b+10=10所以a=8
 
#define max(a,b) ((a) > (b) ? (a) : (b))
max(++a, b);
经过宏替代后的意思基本描述如下:
if ( (++a) > b ) return ++a ;
if ( (++a) < b ) return ++a ;
第一次a=5,b=0 ,++a被执行两次,a等于7
第二次a=7,b=10,++a执行一次,所以a等于8了
明白了吗?

喝,我怎么跑到楼下了。
 
dongberlin 的意思是:
在宏定义转换为(++a)>(b)? (++a):(b)时,这个三目运算操作把++a进行了2次运算,对吗?
这样一说,小弟明白了!
三目运算的优先级是 自左到右 还 从右到左?
 
刘芳:
谢谢!
你的描述很清楚,小弟看明白了!
 
问题结束~
已经给 do
ngberlin hpretty 刘芳 加分了!
 
后退
顶部