【问题标题】:Obscure ternary operator usage [duplicate]晦涩的三元运算符用法[重复]
【发布时间】:2012-10-02 15:30:34
【问题描述】:

可能重复:
Why would you use the ternary operator without assigning a value for the “true” condition (x = x ?: 1)

在一个人的书中,我看到了三元运算符用法的模糊(对我而言)语法:

int nr = nr ? : 1; /* allowed shortcut, same as "nr ? nr : 1" */

这到底是什么意思?在代码中的某处声明了“nr”变量,它的初始值基于比较结果是否“nr”(其中有一个垃圾,我猜是 O_o)不等于零......如果是,那么它会得到什么价值?

【问题讨论】:

  • 该行也声明了 nr,因此它在初始化之前就已被使用,这意味着该行可能导致任一分支被采用而无法预测。对我来说,这似乎不是特别有用的代码行。
  • 不是骗子"这个是声明一个变量并用它自己初始化它!那个不是...
  • @JohannesSchaub-litb:我认为问题的关键在于如果nr 评估为true 会发生什么,即分配什么值。扩展的规范回答了这个问题。
  • @EdS 这是非常值得怀疑的,因为 that 答案已经在这个问题中给出,作为示例代码中的 c 注释..
  • @EdS 如果int 具有陷阱表示,则该位置中的位可能确实构成一个,“不确定值”在 3.19.2 中定义为“未指定的值或陷阱表示”( n1570)。无论如何,它是附件 J.2“未定义行为”的 UB:“具有自动存储持续时间的对象的值在不确定时使用(6.2.4、6.7.9、6.8)”。 (是的,附件 J 仅提供信息,但在这里非常明确。)

标签: c conditional-operator


【解决方案1】:

这是对三元数组的扩展,允许省略第二个操作数,如注释中所述。

这个:

int nr = nr ? : 1;

相当于:

int nr = nr ? nr : 1;

我相信这是一个 GCC 特定的扩展,here's GCC 扩展页面。

正如其他人在 cmets 中指出的那样,由于正在声明 nr 并且在声明中使用了它的值,因此该行的结果是不可预测的。

猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2019-07-14
  • 2011-05-05
  • 2014-09-29
  • 2011-07-07
  • 2014-04-20
相关资源
最近更新 更多