【问题标题】:Order of evaluation for ternary operator in CC中三元运算符的求值顺序
【发布时间】:2020-12-02 13:54:18
【问题描述】:

我知道根据标准,应该避免fun(++a, a),因为第二个参数没有很好地定义。

但是,这种配方是否安全:

(++a ? a : 10);

我测试了这个 sn-p,它按预期工作,ie 对于a = -1,它的计算结果为10,对于任何其他a,它的计算结果为a+1。这是在标准中明确定义的,还是很大程度上取决于编译器?

【问题讨论】:

  • 阅读n1570
  • 据此,可以安全地假设第二个和第三个参数在第一个参数之后进行评估。尽管如此,我仍然希望得到更有经验的人的确认。
  • 代码审查不安全 - 我仍然会解雇你:)
  • @MartinJames 你一开始就买不起我 ;)
  • @Marko 哈哈,稍后在 JobCentre 见:)

标签: c standards conditional-operator


【解决方案1】:

这个定义很好。

在三元表达式中,首先计算第一部分。然后根据该值,评估第二部分或第三部分。所以++a 保证在a 可能被评估之前被评估。

C standard 的第 6.5.15p4 节对此进行了解释:

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

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2021-07-12
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2015-09-29
    相关资源
    最近更新 更多