C 输出是什么?

C 输出是什么?,c,debugging,C,Debugging,可能重复: 以下各项的输出是什么: #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); } 然而,输出是 11 7 7 有人能解释一下吗。还记得宏是如何工作的吗。。它们完全按原样替换文本,并且不像您期望的函数那样评估它们的参数 k= MAN(i+

可能重复:

以下各项的输出是什么:

#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);
}
然而,输出是

11 7 7

有人能解释一下吗。

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

k= MAN(i++,++j); 
实际上是

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

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

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

k= MAN(i++,++j); 
实际上是

k= ((i++) < (++j))?(i++):(++j)
k=((i++)<(+++j))?(i++):(+++j)
这就是为什么
j
会增加两次。

你可以简单地sub:x你可以简单地sub:x它变成

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

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

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

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

它变成了

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

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

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

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

11 7 7

由于人是一个宏而不是一个函数,因此此代码:

k = MAN(i++,++j);
这意味着:

k = ((i++) < (++j))?(i++):(++j)
k=((i++)<(+++j))?(i++):(+++j)
因此,
j
增加两次:在
中增加一次,因为人是一个宏而不是一个函数,所以这个代码:

k = MAN(i++,++j);
这意味着:

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

因此,
j
增加两次:一次在宏中的
中,它不计算值并传递它,只需替换符号,这样它就会变成这样

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

在这里,++j执行两次,答案变成11,7,7,在宏中,它不计算值并传递它,只是替换符号,所以它变成这样的东西

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

这里,++j执行两次,结果变成11,7,7

+1。。。我非常讨厌知道答案的感觉,但是打字速度较慢:)@ppeterka也发生在我身上好几次了。我肯定——看到你的代表。这只是一件愚蠢的人的事情,对速度较慢感到不好会取代“嘿,至少我知道正确答案”的感觉:)+1。。。我很讨厌知道答案的感觉,但打字速度较慢:)@ppeterka也发生在我身上好几次。我敢肯定——看到你的代表。这只是一件愚蠢的人的事情,对速度较慢感到不好会取代“嘿,至少我知道正确答案”的感觉:)@chris,这没有关系。我们没有在这里添加任何内容,也没有指定
x=x++
@Xeo这不是一回事。OP的代码基本上是
如果(i++>+++j){k=+++j;}
。顺序很明确,没关系。我忘了里面有一个序列点。计算第一个操作数;它的求值与第二个或第三个操作数(以求值的为准)的求值之间有一个序列点。仅当第一个操作数的比较值不等于0时,才计算第二个操作数;仅当第一个操作数的比较值等于0时,才计算第三个操作数;结果是第二个或第三个操作数(以计算值为准)的值,转换为下面描述的类型。110)@Juhana:是的,nvm,你说得对。@chris,这是无关的。我们没有在这里添加任何内容,也没有指定
x=x++
@Xeo这不是一回事。OP的代码基本上是
如果(i++>+++j){k=+++j;}
。顺序很明确,没关系。我忘了里面有一个序列点。计算第一个操作数;它的求值与第二个或第三个操作数(以求值的为准)的求值之间有一个序列点。仅当第一个操作数的比较值不等于0时,才计算第二个操作数;仅当第一个操作数的比较值等于0时,才计算第三个操作数;结果是第二个或第三个操作数(以计算值为准)的值,转换为下面描述的类型。110)@Juhana:是的,nvm,你是对的。只要查一下,你是对的。伤害解除了,只是查了一下,你是对的。祸不单行。