web-dev-qa-db-ja.com

Cのほかにない三項演算子

Cで三項演算子を使用します。どうすればよいですか。

(a)? b: nothing;

このようなもの。何も使わない部分は何ですか?

28
user437777

そのような三項演算子を使用している場合、おそらく次のように置き換えられます。

if (a) { b; }

muchより良いです。 (意図が明確であるため、コードが読みやすくなり、パフォーマンスの低下はありません。)

ただし、三項演算子を式として使用している場合、つまり.

printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);

a = b*c + (d == 0 ? 1 : <nothing>);

そうして <nothing>値は、使用されているコンテキストによって異なります。最初の例では、<nothing>""、2番目の場合は0

40
huon

省略された偽式は無効です。代わりに条件を逆にしてみてください。

(!a) ?: b;
15
GOSteen

if-elseは制御フローの構成要素です。?:は演算子であり、x ? y : zは式です。式に「値なし」を指定することはできませんが、制御フローには「何もしないパス」を設定できます。 if-elseと?:の間に実質的な同等性はありません。-すべての状況で互換性があるわけではありません。

someの状況では望みの効果を達成できますが、ifなしでelseを使用するよりもおそらく効率的ではありません。たとえば、次の効果:

if( x )
{
    y = z ;
}

以下によって達成できます。

y = x ? z : y ;

ただし、xがfalseの場合、コンパイラが最適化する場合もしない場合もありますが、効果的で冗長なelse y = y割り当てがあります。したがって、?:式の結果として返される「現在の値」がわかっている場合にのみ、効果を得ることができます。

10
Clifford

else部分は省略できません。 none式を使用してください。

ただし、その場合、if...を使用する方が良い場合がよくあります。

3
md5

この質問はしばらく前からあったようですが、GCC 4.6.3でコンパイルされた短いCプログラムFWIWは次のことを明らかにしました。

  1. 以下はコンパイルされません:a = a ? b:;。 「エラー:「;」トークンの前に式が必要です」。
  2. 以下は同等です:a = a ?: b;およびa = a ? a : b;

おそらく誰かがコンパイラ側の詳細を追加できるかもしれませんが、私にとっては、true実行パスを省略することは単に空想に過ぎないようです。

2
danns87

そこに整数を入れてみましたが、うまくいきます。たとえば、trueと評価された場合に「a」を返したい場合は、次のように記述できます。

true ? a : 1;
0
Y.Du

これは私がしました

isLeapYear(i) ? cout<< i<<endl: cout<<"" ;

ただし、これでパフォーマンスが低下するかどうかはわかりません。

0
0xcrab