这是根据Wikipedia对三元运算的 GNU 扩展。
iMyVal = --iVal ?: iDft;
虽然我完全知道这是一个 GNU 扩展,但有时使用这种特殊语法可能会非常方便。
那么,有人知道这种语法是否仅适用于gcc
? 或者他们是支持它的任何其他编译器吗?
对于任何感兴趣的人,PHP 从 5.3 开始支持这种语法
提前致谢。
这是根据Wikipedia对三元运算的 GNU 扩展。
iMyVal = --iVal ?: iDft;
虽然我完全知道这是一个 GNU 扩展,但有时使用这种特殊语法可能会非常方便。
那么,有人知道这种语法是否仅适用于gcc
? 或者他们是支持它的任何其他编译器吗?
对于任何感兴趣的人,PHP 从 5.3 开始支持这种语法
提前致谢。
一些答案:
底线 -不广泛。只有几乎 100% 与 gcc 兼容的 Intel 编译器支持这一点。?
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 表达式评估(因为原始三元运算符扩展有效)