以下程序的输出为:3 1 3
int main()
{
int a = 0, b = 1, c = 3;
*((a) ? &b : &a) = a ? b : c; // Couldn't understand expression
printf("%d %d %d \n", a, b, c);
return 0;
}
三元运算符如何在此处输出此输出?
答案 0 :(得分:5)
*( (a) ? &b : &a) = a ? b : c ;
^ ^
= 0 = 0
==false ==false
所以上面的表达式:
*( &a) = c ;
即:
a = c ;
因为c = 3;
,所以它给出了:
a = 3 ;
您的声明中 b
1
且c
为3
(保持不变)。
答案 1 :(得分:0)
我的C有点弱,所以如果我在这里偏离基地,有人让我知道。
假设您正在谈论表达式*((a) ? &b : &a)
(并且您知道三元运算符通常如何工作),以下是它如何分解:
评估条件(a)
:在布尔值中使用int
时,0
求值为false,而正(或非零?)值求值为true - 在此case,a == 0
是假的。
如果为true,则三元组返回值&b
,如果为false则返回&a
(在这种情况下,它返回false,因此返回&a
)。
这样返回的值是对变量的引用;周围括号前的星号取消引用此引用,因此表达式*((a) ? &b : &a)
计算变量 - 但不是 - a
的值(如果a
不是0
,则表达式将评估为b
)。
然后该行将此变量(在本例中为a
)分配给第二个三元表达式的值,我假设您可以找出它。
最终效果是它将c
的值分配给变量a
,这解释了输出。
答案 2 :(得分:0)
请注意,ternary conditional operator的precedence比赋值运算符高dereference。三元条件具有以下形式:
condition
?
true-result
:
false-result
如果condition
为真,则结果为true-result
,否则结果为false-result
。从某种意义上来说,操作员是短路的,只有一个结果被评估过。
此运算符可用于条件赋值。例如:
int days_of_year = is_leap_year ? 366 : 365;
三元条件的结果是r值。这意味着结果是一个不能作为赋值目标的值。但是,有一个技巧可用于使用指针和{{3}}的三元条件,以便获得有条件地分配给一个或另一个变量的行为。
int x;
int y;
*(need_x ? &x : &y) = 0;
虽然三元条件的结果是r值,但是取消引用的结果是l值。这意味着取消引用的结果可以用作赋值的目标。
您的代码组合使用了这两种想法。