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,你是对的。只要查一下,你是对的。伤害解除了,只是查了一下,你是对的。祸不单行。