C语言 了解一元运算符的工作原理

wlp8pajw  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(75)

以下代码的输出是什么?在线编译器给予了结果:12611有人能告诉我怎么做的吗?

#include<stdio.h>

#define MAX(x,y) (x)>(y)?(x):(y)

main()
{
    int i = 10, j = 5, k = 0;
    k = MAX(i++, ++j);
    printf("%d %d %d", i, j, k);
}
mwngjboj

mwngjboj1#

它被翻译成:

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

现在很容易说出原因。
i++使得i为11,++j使得j为6。现在我们有:

10 > 6

这是真的,那么我们返回i++,现在是12。
使用-E标志查看预处理器的输出。

cyej8jka

cyej8jka2#

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

此代码将被替换为

k = (i++)>(++j)?(i++):(++j);

当检查条件(i++)>(++j)时,i是后递增(在操作之后它将递增)并且j是前递增(递增j并替换它)。因此,当检查时,它将花费(10)>(6),这是真的!在该检查之后,i将变为11。

k = (i++)>(++j)?(i++):(++j); --> k = (i++)>(++j)?((11)++):(++j); // note after condition check i becomes 11.
// due to post increment after assigning the value to k, i will be incremented to 12. but the last ++j wont excuted.

所以你会得到输出12 6 11
否则,您可以将k = (i++)>(++j)?(i++):(++j);重写为

if((i++)>(++j)) //when condition check i=10, j=6 after check i=11,j=6
k=i++; // k= 11++; after assigning 11 to k i will be incremented to 12
else
k=++j; // this wont be executed

相关问题