【问题标题】:Ternary operator without the middle expression没有中间表达式的三元运算符
【发布时间】:2016-04-06 05:01:43
【问题描述】:

我最近意识到您可以在 GCC 和 clang 中使用三元运算符而无需中间(?:? : 有效),它会将第一个表达式插入中间:

// outputs 2
cout << (2 ?: 4);
// outputs 3
cout << (0 ?  : 3);

这在标准中的什么地方?我看了看,什么也没看到。

【问题讨论】:

  • 它不会在中间插入第一个表达式。它使用中间第一个表达式的result。所以如果第一个表达式是一个函数,这个函数不会被执行两次。

标签: c++ gcc clang ternary-operator conditional-operator


【解决方案1】:

它根本不在标准中

您观察到的是 GCC 扩展:https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html

如果你省略它,它的值取自上下文转换为bool之前的第一个操作数。
扩展的价值在于不重复副作用和减少源代码大小。

【讨论】:

  • 这就是我的想法,谢谢。那么它在 clang 中的存在也是有道理的。
  • 拥有仅适用于 GCC/Clang 的 C++ 代码是个好主意吗?
  • @Ilya 在不花费太多精力或不可接受地损害性能的情况下,尽可能编写干净且可移植的代码是个好主意。简而言之,几乎从来没有。
  • 在这种情况下,一方面你会有一个不可移植的、不太明显(因为非标准)的代码,另一方面会更冗长(可能是一个更多的布尔值)。你会选择第一个选项吗?
  • @Ilya 少量的额外输入对于符合标准来说是很小的代价。我之前的评论比较笼统。
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2012-09-02
  • 1970-01-01
  • 2014-09-15
  • 2011-09-09
  • 1970-01-01
  • 2011-03-11
  • 2020-03-30
相关资源
最近更新 更多