无法理解三元运算符的行为

时间:2013-08-13 15:15:18

标签: c ternary

以下程序的输出为: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;
}

三元运算符如何在此处输出此输出?

3 个答案:

答案 0 :(得分:5)

 *( (a) ? &b : &a) =     a ? b : c ;
     ^                   ^
     = 0                 = 0
     ==false             ==false

所以上面的表达式:

 *( &a) =  c ;

即:

     a =  c ;

因为c = 3;,所以它给出了:

     a =  3 ;   
您的声明中

b 1c3(保持不变)。

答案 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 operatorprecedence比赋值运算符高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值。这意味着取消引用的结果可以用作赋值的目标。

您的代码组合使用了这两种想法。