44

Cでelseなしで三項演算子を使いたいのですが、どうすればいいですか?

(a)? b: nothing;

このようなもの。何もない部分で何を使用しますか?

4

9 に答える 9

50

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

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

于 2012-09-04T09:48:38.233 に答える
27

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

(!a) ?: b;
于 2013-09-14T10:33:42.223 に答える
13

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

状況によっては希望する効果を得ることができますが、を使用しifない場合よりも効率が低下する可能性がありelseます。たとえば、次のような効果があります。

if( x )
{
    y = z ;
}

次の方法で実現できます。

y = x ? z : y ;

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

于 2012-09-04T12:38:16.957 に答える
3

の部分は省略できませんelse。none 式を使用するだけです。

しかし、その場合、多くの場合、if...

于 2012-09-04T09:44:23.577 に答える
2

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

  1. 以下はコンパイルされません: a = a ? b:;. 「エラー: ';' の前に期待される式 トークン"。
  2. 以下は同等です:a = a ?: b;a = a ? a : b;

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

于 2014-03-14T01:47:25.247 に答える
0

三項式は、ブール条件から派生するステートメントに基づいています。ステートメントがマークさvoid()れている場合、予想どおり、何も起こりません。

C++ コード:

condition ? add(value) : void();

C コード:

condition ? add(value) : 0;
于 2021-04-01T15:41:33.943 に答える
-9

これを試して

BOOL bIsOK = (a == 5)?TRUE:FALSE;
于 2012-09-04T11:12:05.137 に答える