以下程序的输出是: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;
}
三元运算符是如何在这里输出的?
*( (a) ? &b : &a) = a ? b : c ;
^ ^
= 0 = 0
==false ==false
所以上面的表达式:
*( &a) = c ;
那是:
a = c ;
因为c = 3;
,所以它给出:
a = 3 ;
b
is1
和c
is3
在您的声明中(保持不变)。
我的 C 有点弱,所以如果我在这里偏离基地,有人告诉我。
假设您正在谈论表达式*((a) ? &b : &a)
(并且您知道三元运算符的一般工作原理),以下是它的分解方式:
评估条件(a)
:当int
在布尔值中使用 an 时,0
评估结果为假,而正(或非零?)值评估为真——在这种情况下,a == 0
为假。
&b
如果为真,则三元数返回值,&a
如果为假(在这种情况下为假,因此返回&a
)。
这样返回的值是对变量的引用;圆括号前的星号取消引用此引用,因此表达式*((a) ? &b : &a)
计算为变量 - 但不是 - 的值a
(如果a
不是0
,则表达式将计算为b
)。
然后该行将第二个三元表达式的值分配给该变量(在本例中a
),我假设您可以弄清楚。
最终效果是将 的值分配给c
变量a
,这解释了输出。
请注意,三元条件运算符的优先级高于赋值运算符。三元条件具有以下形式:
condition
?
true-result
:
false-result
如果condition
为真,则结果为true-result
,否则结果为false-result
。从某种意义上说,操作员是短路的,只有一个结果被评估过。
该运算符可用于条件赋值。例如:
int days_of_year = is_leap_year ? 366 : 365;
三元条件的结果是一个 r 值。这意味着结果是一个不能作为赋值目标的值。但是,有一个技巧可用于使用带有指针和取消引用的三元条件,以便获得有条件地分配给一个或另一个变量的行为。
int x;
int y;
*(need_x ? &x : &y) = 0;
三元条件的结果是 r 值,而取消引用的结果是 l 值。这意味着取消引用的结果可以用作赋值的目标。
您的代码结合使用这两种想法。