2

Wikipediaによると、これは三項演算の GNU 拡張です。

iMyVal = --iVal ?: iDft;

これが GNU 拡張機能であることは十分承知していますが、この特殊な構文を使用すると非常に便利な場合があります。

では、この構文が でのみ使用できるかどうかを知っている人はいますgccか? それとも、それをサポートする他のコンパイラですか?

興味のある人には、PHP は 5.3 からこの構文をサポートし始めました。

前もって感謝します。

4

2 に答える 2

4

いくつかの答え:

  1. GCC - はい
  2. MSVC - いいえ (vanetto の回答に基づく)
  3. CLANG -いいえはい - 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;}

ラムダ遅延により、条件の再計算と不必要な case0 式の評価が防止されます (元の三項演算子拡張が機能するため)

于 2012-09-14T09:35:22.127 に答える