0

可能重复:
C 中以下宏的副作用是什么?嵌入式 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

有人可以解释一下吗。

4

5 回答 5

4

记住宏是如何工作的。它们完全按原样替换文本,并且不会像您期望的函数那样评估它们的论点。

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

实际上是

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

这就是为什么j增加两次。

于 2013-02-01T09:00:49.650 回答
1

您可以简单地将: x <- i++, y <- ++j 放入您的宏定义中,然后您可以看到

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

i++ 和 ++j 在进行比较时都被执行;由于比较返回 false,将执行 ++j 因此您得到了结果

于 2013-02-01T09:01:25.177 回答
0

它成为了

i++ < ++j ? 我++ : ++j

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

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

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

11 7 7

于 2013-02-01T09:01:57.190 回答
0

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

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

这意味着:

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

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

于 2013-02-01T09:04:23.227 回答
0

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

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

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

于 2013-02-01T09:07:01.477 回答