C++中关于define的问题

来源:百度知道 编辑:UC知道 时间:2024/05/14 11:20:15
#define MAX(a,b) ((a)>(b)?(a):(b))
对于下面的定义有如下疑问
int a=1,b=0;
MAX(a++,b);//a被增值2次
MAX(a++,b+10);//a被增值1次
请问为什么这里a被增值的次数不一样,且为什么第一个表达式中a被增值2次而第二个只被增值一次
为什么MAX(a++,b)的值为2时a的值为3
为什么MAX(a++,b+10)的值为10,a的值为2
#define MAX(a,b) ((a)>(b)?(a):(b))对于这个宏定义
int a=1,b=0;
MAX(a++,b)取值为什么是2而不是1
我的理解:a++是后增量,先确定a的值为1和b比较,且比b大,所以取a的值,那这个a的值应该是参加比较的值而不是增过值后的值,即应该取1,但是我看见书上说的是2
还有第二个问题,网友的回答是:
第一步比较a与b的大小,之后a增值1
第二步因为第一步中a>b,所以MAX(a++,b)的取值为a++,之后a又增值1
我想知道的是为什么MAX(a++,b)取值为a++后,为什么又增1

对于宏 #define MAX(a,b) ((a)>(b)?(a):(b))
((a)>(b)?(a):(b))的值为a,b中较大的那个表达式的值
当a>b时执行表达式1(即(a))否则执行表达式2(即(b))
当a=1,b=0时 MAX(a++,b);展开即为((a++)>(b)?(a++):(b))
因为条件成立故除了执行(a++)>(b)?表达式1(即(a++))也被执行,则a++执行两次.
而MAX(a++,b+10);(a++)<(b+10)故只有(a++)>(b+10)?被执行,此时a++执行一次

MAX(a++,b) -> ((a++)>(b)?(a++):(b))
第一步比较a与b的大小,之后a增值1
第二步因为第一步中a>b,所以MAX(a++,b)的取值为a++,之后a又增值1

而在MAX(a++,b+10)中,比较a和b+10大小时,a<b+10,所以跳到b那一步,a没有再增值