【问题标题】:Ternary and comma operator [duplicate]三元和逗号运算符[重复]
【发布时间】:2016-11-01 21:56:29
【问题描述】:
int a,b;
a = 1 ? 1,2 : 3,4; // a = 2
b = 0 ? 1,2 : 3,4; // b = 3

逗号运算符总是返回逗号的右侧,但是如果我们对变量进行赋值,它会返回左侧,除非我们使用 () 的情况。 那么第一个表达式到底是如何给出 2 的。

我认为它是 a = 1,2 所以它应该是 1 但实际上是 a=2。

为什么?

【问题讨论】:

  • 别这样。可能是编译器因为你写了那种代码而惩罚你。
  • 我的大学教授向我们展示了这一点。我检查了编译器。 msvc, gcc 给出相同的结果
  • 逗号运算符的家伙。它不是一个元组
  • b = 0 ? 1,2 : 3,4; === (b = 0 ? (1,2) : 3),4;.. 怎么样?
  • @SouravGhosh 就是这样!我怎么看不到。谢谢!

标签: c++ c ternary-operator comma-operator


【解决方案1】:

由于operator precedence逗号运算符具有最低优先级),您的代码实际上看起来像

int a,b;
(a = 1 ? (1,2) : 3),4; // a = 2
(b = 0 ? (1,2) : 3),4; // b = 3

因此,根据三元条件规则,引用 C11,第 6.5.15 章

计算第一个操作数;在它的求值和 第二个或第三个操作数的评估(以评估者为准)。第二个操作数 仅当第一个比较不等于 0 时才评估;仅在以下情况下评估第三个操作数 第一个比较等于 0;结果是第二个或第三个操作数的值 (以评估为准),转换为下面描述的类型。 110)

[...]

110) 条件表达式不会产生左值。

  • 对于第一种情况,计算并返回第二个操作数。
  • 对于第二种情况,计算并返回第三个操作数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2021-04-14
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多