任何人都可以帮我解释一下上面代码的输出。 它将在不同的编译器中打印不同的输出。哪一个 一个值得考虑的事。
#include<stdio.h>
int main()
{
int a=0, b=1, c=2;
*((a+1 == 1) ? &b : &a) = a ? b : c;
printf("%d, %d, %d\n", a, b, c);
return 0;
}
0,2,2
此输出来自Codeblocks
答案 0 :(得分:6)
您的代码相当于:
int* ptr;
if (a + 1 == 1) // which is true
{
ptr = &b; // So ptr points to b
}
else
{
ptr = &a;
}
if (a != 0) // which is false
{
*ptr = b;
}
else
{
*ptr = c; // so *ptr (which is same as b) is set equal to c
}
所以会发生什么是b=c;
答案 1 :(得分:4)
代码中的行
*((a+1 == 1) ? &b : &a) = a ? b : c;
使用conditional operator(或三元运算符)?:
。根据属性,引用C11
,章节§6.5.15,
评估第一个操作数;它的评价和评价之间有一个序列点 评估第二或第三操作数(以评估者为准)。第二个操作数 仅当第一个比较不等于0时才计算;第三个操作数仅在以下情况下进行评估 第一个比较等于0;结果是第二个或第三个操作数的值 (无论哪个被评估),转换为下面描述的类型[...]
所以,对于LHS来说,
*((a+1 == 1) ? &b : &a)
a
为0,因此(a+1 == 1)
为真(1),因此它会缩减为*(&b)
(第二个操作数)。
对于RHS,
a ? b : c;
a
为0,它减少为c
,(第三个操作数)。
所以,合在一起,它是
*(&b) = c;
或
b = c;
答案 2 :(得分:0)
int a=0, b=1, c=2;
*((a+1 == 1) ? &b : &a) = a ? b : c;
printf("%d, %d, %d\n", a, b, c);
a + 1 - &gt; 0 + 1 - &gt; 1 == 1真,因此*(&amp; b) 现在,a = 0 false,因此c。
现在将*(&amp; b)= c等于b = c,a和c不会改变。
a ? b : c
与:
相同 if(a)
b;
else
c;