2

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

iMyVal = --iVal ?: iDft;

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

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

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

提前致谢。

4

2 回答 2

4

一些答案:

  1. 海湾合作委员会 - 是的
  2. MSVC - 否(基于瓦内托的回答)
  3. CLANG - no yes - LLVM 在线编译器成功编译它。
  4. 英特尔 C 编译器 - 是的

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

于 2012-09-14T07:59:45.643 回答
1

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 表达式评估(因为原始三元运算符扩展有效)

于 2012-09-14T09:35:22.127 回答