没有第二个操作数的三元运算符[重复]

Posted

技术标签:

【中文标题】没有第二个操作数的三元运算符[重复]【英文标题】:Ternary operator without second operand [duplicate] 【发布时间】:2016-04-13 07:00:37 【问题描述】:

这是一个两方面的问题:一个是针对 C 的,一个是针对 C++ 的。

C 和 C++ 标准对以下三元 (?:) 运算符的使用有什么看法:

const char* opt = /* possible NULL pointer */;
const char* str = opt ?: "";

什么时候开始合法的?它是编译器扩展吗?第一个操作数有什么要求(隐式转换为bool/int)?

【问题讨论】:

【参考方案1】:

省略中间操作数的三元运算符:

const char* str = opt ?: "";

是一个 GNU 扩展,它不是标准的 C++。

【讨论】:

谢谢。对它的第一个操作数有什么要求? @YSC:条件值和真值合并:opt ?: "" 等价于opt ? opt : "" TartanLlama 已经给出了答案。 @101010 其实这个答案是在 Tartan 之前提供的。【参考方案2】:

GCC 将其作为extension 提供。这不在 C++ 标准中。

语义是如果条件不为零,则表达式的值就是条件的值。

隐含的要求是条件必须与第三个操作数类型兼容,即一个可以按照通常的条件运算符规则转换为另一个。

重要的是要注意,如果条件是从具有副作用的函数计算的,则该值将不会使用此扩展重新计算:

opt() ?: ""; //opt called once
opt() ? opt() : ""; //opt called twice

【讨论】:

以上是关于没有第二个操作数的三元运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在JS中编写三元运算符的更短方法[重复]

Java三元运算符语法[重复]

Python:拥有三元运算符的有效方法[重复]

三元运算符

Java第二周总结

从三元运算符返回 lambda [重复]