-1

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

三元运算符是如何在这里输出的?

4

3 回答 3

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

所以上面的表达式:

 *( &a) =  c ;

那是:

     a =  c ;

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

     a =  3 ;   

bis1cis3在您的声明中(保持不变)。

于 2013-08-13T15:30:33.773 回答
0

我的 C 有点弱,所以如果我在这里偏离基地,有人告诉我。

假设您正在谈论表达式*((a) ? &b : &a)(并且您知道三元运算符的一般工作原理),以下是它的分解方式:

评估条件(a):当int在布尔值中使用 an 时,0评估结果为假,而正(或非零?)值评估为真——在这种情况下,a == 0为假。

&b如果为真,则三元数返回值,&a如果为假(在这种情况下为假,因此返回&a)。

这样返回的值是对变量的引用;圆括号前的星号取消引用此引用,因此表达式*((a) ? &b : &a)计算为变量 - 但不是 - 的值a(如果a不是0,则表达式将计算为b)。

然后该行将第二个三元表达式的值分配给该变量(在本例中a),我假设您可以弄清楚。

最终效果是将 的值分配给c变量a,这解释了输出。

于 2013-08-13T15:32:26.527 回答
0

请注意,三元条件运算符的优先级高于赋值运算符。三元条件具有以下形式:

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 值。这意味着取消引用的结果可以用作赋值的目标。

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

于 2013-08-13T15:41:21.943 回答