【问题标题】:How the variable values are changing while using conditional operator?使用条件运算符时变量值如何变化?
【发布时间】:2016-11-24 15:26:49
【问题描述】:

谁能帮我解释一下上面代码的输出.. 它将在不同的编译器中打印不同的输出。哪一个 一个可以考虑。

代码

#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

此输出来自代码块

【问题讨论】:

  • 哪个编译器给出了不同的输出?

标签: c pointers ternary-operator conditional-operator


【解决方案1】:

代码中的行

   *((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),因此它减少为 *(&amp;b)(第二个操作数)。

对于 RHS,

     a ? b : c;

a 为 0,则归约为 c,(第三个操作数)。

所以,综合起来,就是

 *(&b) = c;

  b = c;

【讨论】:

    【解决方案2】:

    您的代码相当于:

    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;

    【讨论】:

      【解决方案3】:
      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 -> 0+1 -> 1 == 1 真,因此 *(&b) 现在,a = 0 false,因此 c。

      现在将 *(&b) = c 等同于 b = c , a 和 c 不会改变。

      a ? b : c
      

      等同于:

        if(a)
              b;
          else
              c;
      

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 2019-05-15
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        相关资源
        最近更新 更多