在<<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的递增次数竟然取决于“它被拿来和谁比较”这里我不理解,为什么会是这样的情况?
望有人能解答。

解决方案 »

  1.   

    手误,少写了一个括号。在 < <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的递增次数竟然取决于“它被拿来和谁比较” 这里我不理解,为什么会是这样的情况? 
    望有人能解答。
      

  2.   

    被直接暴力的作为((++a)> (b) ? (++a) : (b)) 当b小时,取(++a)值时会在加一次可以测试一下
    a=5;
    CALL_WITH_MAX(++a,0); //a被累加二次
    CALL_WITH_MAX(++a,10); //a被累加二次
      

  3.   

    a的递增次数就是++a的执行次数,这是由“?:”运算符的性质决定的。  语句1 ? 语句2 : 语句3先执行 语句1,
    当 语句1 执行结果是 true 时执行 语句2 并返回 语句2 的执行结果;
    当 语句1 执行结果是 false 时执行 语句3 并返回 语句3 的执行结果。
      

  4.   

    我觉得应该是#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)) 的原因 
    可以这么看 把定义改成
    #define CALL_WITH_MAX(N,b) f((N)>(b)?(N):(b))
    调用的时候 N是被赋予++a,所以在调用的时候a的值加了一次,而在?:后因为>b所以函数f的参数是N,这时又被加了1,因为这个N也是++a
      

  5.   

    我觉得应该是#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)) 的原因 
    可以这么看 把定义改成
    #define CALL_WITH_MAX(N,b) f((N)>(b)?(N):(b))
    调用的时候 N是被赋予++a,所以在调用的时候a的值加了一次,而在?:后因为>b所以函数f的参数是N,这时又被加了1,因为这个N也是++a
      

  6.   

    哦,明白了。
    #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就不会累加两次了。