可能重复:
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
有人可以解释一下。
答案 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