这个GNU扩展在三元运算上有多广泛?

根据维基百科,这是三元运算的GNU扩展。

iMyVal = --iVal ?: iDft; 

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

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

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

提前致谢。

一些答案:

  1. GCC – 是的
  2. MSVC – 否(基于vanetto的回答)
  3. CLANG – 没有 – LLVM在线编译器成功编译它。
  4. 英特尔C编译器 – 是的

底线 – 没有广泛传播。 只有英特尔的编译器(几乎100%兼容gcc)才支持这一点。

C ++ 11解决方法:

 template 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 lasyness可以防止条件重新计算和不必要的case0表达式评估(因为原始的三元运算符扩展工作)