【问题标题】:How wide-spread is this GNU extension on ternary operation?三元运算符的这个 GNU 扩展有多广泛?
【发布时间】:2012-09-07 08:39:02
【问题描述】:

这是根据Wikipedia 对三元运算的 GNU 扩展。

iMyVal = --iVal ?: iDft;

虽然我完全知道这是一个 GNU 扩展,但有时使用这种特殊语法可能会非常方便。

那么,有人知道这种语法是否仅在gcc 中可用?或者他们是支持它的任何其他编译器吗?

对于任何感兴趣的人,PHP 从 5.3 开始支持这种语法

提前致谢。

【问题讨论】:

  • 当你可以简单地使用iMyVal = --iVal ? --iVal : iDft;时为什么要使用那个扩展我不知道它是否only在GCC中可用,但我可以肯定地告诉你它是在 MSVC 中可用。无论如何,如果您希望您的代码兼容,请不要使用编译器特定的扩展...如果您必须像现在这样询问,请不要使用它。
  • @vanneto,你的建议是错误的 - 它减少了 iVal 两次。你可以修复它,但如果包裹在宏中会变得很棘手。
  • 您为什么要冒险通过省略一个令牌来承担不可移植的风险?恕我直言,iMyVal = --iVal ? iVal : iDft; 的打字工作量并没有显着增加,但更具可读性、更易理解和便携。
  • 是的,抱歉,我只是想修复我的代码。无论如何,如果你想要便携,你就必须避免这种语法糖(在这种情况下,IMO 更像是盐)。
  • @Andreas 提供的示例过于简单。让我们看看...试着想想strtok_r。 ;)

标签: c++ c ternary-operator


【解决方案1】:

一些答案​​:

  1. GCC - 是的
  2. MSVC - 否(根据瓦内托的回答)
  3. CLANG - no 是 - the LLVM online compiler 编译成功。
  4. 英特尔 C 编译器 - 是

底线 - 没有广泛传播。只有几乎 100% 与 gcc 兼容的 Intel 编译器支持这一点。?

【讨论】:

  • 我希望 CLANG 支持它,因为他们使用 CLANG 来编译使用大量 gcc 扩展的 Linux 内核。
  • 感谢@MaximYegorushkin,看来它确实支持它。
  • @ugoren 谢谢。我正在寻找这份情况说明书。
【解决方案2】:

C++11 解决方法:

template<typename Fcond, typename Flast>
auto ternary2support(Fcond fcond, Flast flast) -> decltype(fcond())
{
  auto    cond_result= fcond();
  return  cond_result? cond_result : flast();
}


#define ternary2(c,case0) ternary2support(  [&](){ return (c);}, [&](){ return (case0);} )


void test_tern2()
{
  int i= 3;

  int res1= ternary2(--i,1000);
  int res2= ternary2(--i,1000);
  int res3= ternary2(--i,1000);

  std::cout<<" res1="<< res1<<" res2="<< res2<<" res3="<< res3;
  // output: res1=2 res2=1 res3=1000

}

int main(){test_tern2(); return 0;}

Lambda 惰性可防止条件重新计算和不必要的 case0 表达式求值(因为原始三元运算符扩展的工作原理)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 2014-10-10
    • 2017-09-20
    • 2011-12-07
    • 1970-01-01
    • 2021-12-08
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多