Cで三項演算子を使用します。どうすればよいですか。
(a)? b: nothing;
このようなもの。何も使わない部分は何ですか?
そのような三項演算子を使用している場合、おそらく次のように置き換えられます。
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
。
省略された偽式は無効です。代わりに条件を逆にしてみてください。
(!a) ?: b;
if-else
は制御フローの構成要素です。?:
は演算子であり、x ? y : z
は式です。式に「値なし」を指定することはできませんが、制御フローには「何もしないパス」を設定できます。 if-elseと?:の間に実質的な同等性はありません。-すべての状況で互換性があるわけではありません。
someの状況では望みの効果を達成できますが、if
なしでelse
を使用するよりもおそらく効率的ではありません。たとえば、次の効果:
if( x )
{
y = z ;
}
以下によって達成できます。
y = x ? z : y ;
ただし、xがfalseの場合、コンパイラが最適化する場合もしない場合もありますが、効果的で冗長なelse y = y
割り当てがあります。したがって、?:
式の結果として返される「現在の値」がわかっている場合にのみ、効果を得ることができます。
else
部分は省略できません。 none式を使用してください。
ただし、その場合、if
...を使用する方が良い場合がよくあります。
この質問はしばらく前からあったようですが、GCC 4.6.3でコンパイルされた短いCプログラムFWIWは次のことを明らかにしました。
a = a ? b:;
。 「エラー:「;」トークンの前に式が必要です」。a = a ?: b;
およびa = a ? a : b;
おそらく誰かがコンパイラ側の詳細を追加できるかもしれませんが、私にとっては、true
実行パスを省略することは単に空想に過ぎないようです。
そこに整数を入れてみましたが、うまくいきます。たとえば、trueと評価された場合に「a」を返したい場合は、次のように記述できます。
true ? a : 1;
これは私がしました
isLeapYear(i) ? cout<< i<<endl: cout<<"" ;
ただし、これでパフォーマンスが低下するかどうかはわかりません。