什么输出?

时间:2013-02-01 08:56:41

标签: c debugging

  

可能重复:
  What’s the side effect of the following macro in C ? Embedded C

以下内容的输出结果如何:

#include <stdio.h>
#define MAN(x,y) ((x) < (y))?(x):(y)
main()
{  
    int i=10,j=5,k=0;
    k= MAN(i++,++j);
    printf("%d %d %d" ,i,j,k);
}

这里我认为MAN(10,6)将被调用,输出将是:

11 6 6

然而输出是

11 7 7

有人可以解释一下。

5 个答案:

答案 0 :(得分:4)

记住宏是如何工作的......它们完全按照原样替换文本,并且不像你期望的那样评估它们的参数。

k= MAN(i++,++j); 

实际上是

k= ((i++) < (++j))?(i++):(++j)

这就是j增加两倍的原因。

答案 1 :(得分:1)

你可以简单地将:x&lt; - i ++,y&lt; - ++ j放入你的宏定义中,然后就可以看到了

((i++) < (++j))?(i++):(++j)

i ++和++ j都是在进行比较时执行的;因为比较返回false,所以会执行++ j,因此得到了结果

答案 2 :(得分:0)

它变成了

i ++&lt; ++ j? i ++:++ j

我不会小于j,所以我们使用第二个参数

所以我们做了一个i ++和++ j以及另一个++ j

所以10 + 1 = 11 5 + 1 + 1 = 7并返回第二个参数..... 7

11 7 7

答案 3 :(得分:0)

由于MAN是而不是函数,因此代码为:

k = MAN(i++,++j);

意思是:

k = ((i++) < (++j))?(i++):(++j)

因此,j会增加两次:一次在<测试中,一次在评估(++j)时。如果MAN函数而不是宏,则递增的将被传递,而不是表达式本身,并且您的答案将是您所期望的。< / p>

答案 4 :(得分:0)

在宏中,它不计算值并传递它只是替换符号所以它变成这样的东西

MAN(i++,++j) ((i++) < (++j))?(i++):(++j)

所以这里++ j执行两次,答案变成11,7,7