Cでelseなしで三項演算子を使いたいのですが、どうすればいいですか?
(a)? b: nothing;
このようなもの。何もない部分で何を使用しますか?
Cでelseなしで三項演算子を使いたいのですが、どうすればいいですか?
(a)? b: nothing;
このようなもの。何もない部分で何を使用しますか?
そのような三項演算子を使用している場合、おそらく次のように置き換えることができます。
if (a) { b; }
これははるかに優れています。(意図がより明確になるため、コードが読みやすくなり、パフォーマンスが低下することはありません。)
ただし、三項演算子を式として使用している場合、つまり
printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);
a = b*c + (d == 0 ? 1 : <nothing>);
次に、<nothing>
値はそれが使用されているコンテキストに依存します。最初の例では、 で<nothing>
ある必要が""
あり、2 番目の例では である必要があります0
。
省略された false 式は無効です。代わりに条件を逆にしてみてください。
(!a) ?: b;
if-else
は制御フロー構造?:
であり、は演算子でありx ? y : z
、式です。式は「値なし」を持つことはできませんが、制御フローは「何もしないパス」を持つことができます。if-elseと?:の間に実際の同等性はありません。これらはすべての状況で互換性があるわけではありません。
状況によっては希望する効果を得ることができますが、を使用しif
ない場合よりも効率が低下する可能性がありelse
ます。たとえば、次のような効果があります。
if( x )
{
y = z ;
}
次の方法で実現できます。
y = x ? z : y ;
else y = y
ただし、xがfalseの場合、コンパイラが最適化する場合としない場合がある、効果的ですが冗長な割り当てがあります。?:
したがって、式の結果として返される「現在の値」がわかっている場合にのみ、効果を達成できます。
の部分は省略できませんelse
。none 式を使用するだけです。
しかし、その場合、多くの場合、if
...
この質問はしばらく前からあったようですが、FWIW GCC 4.6.3 でコンパイルされた短い C プログラムにより、次のことが明らかになりました。
a = a ? b:;
. 「エラー: ';' の前に期待される式 トークン"。a = a ?: b;
とa = a ? a : b;
誰かがコンパイラ側の詳細を追加できるかもしれませんが、私には、true
実行パスを省略することは単なる空想のようです。
三項式は、ブール条件から派生するステートメントに基づいています。ステートメントがマークさvoid()
れている場合、予想どおり、何も起こりません。
C++ コード:
condition ? add(value) : void();
C コード:
condition ? add(value) : 0;
これを試して
BOOL bIsOK = (a == 5)?TRUE:FALSE;