使用条件运算符时变量值如何变化?

时间:2016-07-21 07:14:18

标签: c pointers ternary-operator conditional-operator

任何人都可以帮我解释一下上面代码的输出。 它将在不同的编译器中打印不同的输出。哪一个 一个值得考虑的事。

代码

#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

3 个答案:

答案 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;