【问题标题】:Tricky Ternary Operation in CC中棘手的三元运算符
【发布时间】:2013-05-13 12:02:02
【问题描述】:
 void calculate(){

  int x=3, y=3, z=1;

  printf("%d\n",z+=x<y ? 10:20 );

 }

上面的代码打印出 21。

我明白,首先,程序将计算 x 0,然后 z = z + 0 = 1,程序不应该打印 10,因为 1 是另一种形式的真。

程序显然选择了第二个选项,并且还将其增加到 21,有人可以解释一下吗?

【问题讨论】:

    标签: c ternary-operator


    【解决方案1】:

    条件运算符的优先级高于赋值运算符。

    z+=x&lt;y ? 10:20

    被评估为

    z+= (x&lt;y ? 10:20)

    您可以在此处获得 C 运算符优先级的摘要:

    http://www.kernel.org/doc/man-pages/online/pages/man7/operator.7.html

    【讨论】:

    • -1 用于虚假信息(但我不能反对)。条件运算符的优先级不高于赋值。这就是为什么 int x=3,y=5;x
    • @kotlomoy 首先,您不了解“虚假信息”一词的含义,其次您不了解自己的引用。您是否甚至费心阅读 ouah 的引文、语言标准或任何其他关于 C 优先级的资料,所有这些都证实条件运算符的优先级高于赋值?
    • @Jim Batler 阅读链接。例如,我将给出一个引用:“赋值与表中的条件具有相同的优先级,并且关联性是从右到左,导致赋值在条件之前正确完成。”
    • 请注意,kotlomoy 的链接指向一个 C++ 问题,但这是一个 C 问题。值得注意的是,您不能在 C 中使用三元左值表达式。
    【解决方案2】:

    首先它评估 x 小于 y。由于 x = 3 和 y = 3,这是错误的,所以它的计算结果为 20。

    因为 z 已经 = 1,所以你要加 20:

    z += 20

    z = z + 20

    z = 1 + 20

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2011-02-15
      • 2021-10-25
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多