在<<Effective c++>>中看到
#define CALL_WITH_MAX(a,b) f(a)>(b)?(a):(b))int a=5,b=0;
CALL_WITH_MAX(++a,b); //a被累加二次
CALL_WITH_MAX(++a,b+10); //a被累加一次
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”这里我不理解,为什么会是这样的情况?
望有人能解答。
#define CALL_WITH_MAX(a,b) f(a)>(b)?(a):(b))int a=5,b=0;
CALL_WITH_MAX(++a,b); //a被累加二次
CALL_WITH_MAX(++a,b+10); //a被累加一次
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”这里我不理解,为什么会是这样的情况?
望有人能解答。
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)) int a=5,b=0;
CALL_WITH_MAX(++a,b); //a被累加二次
CALL_WITH_MAX(++a,b+10); //a被累加一次
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较” 这里我不理解,为什么会是这样的情况?
望有人能解答。
a=5;
CALL_WITH_MAX(++a,0); //a被累加二次
CALL_WITH_MAX(++a,10); //a被累加二次
当 语句1 执行结果是 true 时执行 语句2 并返回 语句2 的执行结果;
当 语句1 执行结果是 false 时执行 语句3 并返回 语句3 的执行结果。
可以这么看 把定义改成
#define CALL_WITH_MAX(N,b) f((N)>(b)?(N):(b))
调用的时候 N是被赋予++a,所以在调用的时候a的值加了一次,而在?:后因为>b所以函数f的参数是N,这时又被加了1,因为这个N也是++a
可以这么看 把定义改成
#define CALL_WITH_MAX(N,b) f((N)>(b)?(N):(b))
调用的时候 N是被赋予++a,所以在调用的时候a的值加了一次,而在?:后因为>b所以函数f的参数是N,这时又被加了1,因为这个N也是++a
#define CALL_WITH_MAX(a,b) ((a)>(b)?(a):(b))
相当于
fun()
{
if (a>b)
return a;
else
return b;
}
int a=5,b=0;
CALL_WITH_MAX(++a,b); //a被累加二次
if (++a>0)
return ++a;
所以会加两次。
CALL_WITH_MAX(++a,b+10);
++a,不大于b+10,返回的是b +10,a就不会累加两次了。