web-dev-qa-db-ja.com

2番目のパラメーターが空のC条件演算子( '?')

通常、「?」演算子は次の形式で使用されます。

A ? B : C

ただし、B = Aの場合、次の省略形を見ました。

A ? : C

これは驚くほどうまくいきます。 2番目のパラメーターを(スタイルに関して)残しておく方が良いですか、それとも特定のコンパイラーがこれを処理できない可能性がありますか?

41
Locksleyu

これは言語Cでは(私が知る限り)許可されていませんが、gccなどのコンパイラには extension としてショートカットa?:cがあります。 a?:ca?a:cと同じ意味です。

38
Juri Robl

そのgccの拡張

オペランドが省略された条件

x ? : yx ? x : yと同等です

17
Prasoon Saurav

私がひどい間違いでない限り、あなたはコンパイラの拡張機能を使用しています(おそらく、gcc)。標準ではnotが三項演算子の2番目のオペランドを省略できると確信しています。

3
Jerry Coffin

少し記入します。

標準では条件演算子という用語を使用しています。

構文条件式:
論理OR式
論理OR式  式:条件式

条件式は左辺値を生成しません。また、 ウィキペディア;条件付き

注:すなわち:C++には
論理OR式?式: 割り当て-式

制約:
 *最初のオペランドはスカラー型でなければなりません[1]。
 * 2番目と3番目のオペランドには、次のいずれかが適用されます。[2]; 
 —両方のオペランドが同じ構造[3]または共用体タイプを持っている[4]; 
 —両方のオペランドがvoid型です[5]; 
 —両方のオペランドは互換性のある
タイプの修飾または非修飾[6]バージョンへのポインターです[7]; 
 — 1つのオペランドはポインターで、もう1つのオペランドはnullポインター定数です[8]; or 
 — 1つのオペランドは、オブジェクトまたは不完全な型へのポインタです[9] もう1つの
は、資格のあるバージョンまたは資格のないバージョンのvoidへのポインタです。

フットフード:

[1] スカラー型:算術型とポインター型。
[2] 算術型:整数型と浮動小数点型。
[3] 構造タイプ:順次割り当てられた空でないメンバーオブジェクトのセット(および
特定の状況では、不完全な配列)。それぞれに
オプションで指定された名前と、場合によっては異なるタイプがあります。
[4] ユニオンタイプ:メンバーオブジェクトの重複する空でないセット。それぞれに
オプションで指定された名前と、場合によっては異なるタイプがあります。
[5] Void type:空の値のセットです;これは完了できない不完全なタイプです。
完了できません。
[6] 適格タイプ:1998(constおよびvolatile)、1999(制限)、それぞれ
 2011(_Atomic)。 *[7] 互換タイプ:タイプは同じです。
[8] Null ptr。 const .: NULL;実装定義のnullポインタ定数。
[9] 不完全なタイプ:オブジェクトを説明するタイプですが、サイズを決定するために必要な情報がありません
。

*Cの型修飾子

だから:使用するのは賢明ではありません。

3
Morpfh

私はウィキペディアによると、ウェブで少し研究をしました、この動作はGNU Cの拡張によってサポートされています。 http://en.wikipedia.org/wiki/% 3F:#C

したがって、他のコンパイラがこれを違法と見なしている可能性は非常に高いです。ちなみに、この演算子は三項条件付きと呼ばれているため、参照することができます。

編集:

私はgccとApple llvmをチェックインしましたが、正常に動作します。

1
LuisEspinoza

2番目のパラメーターはそのままにしておくことをお勧めします。Bが変更された場合、上のステートメントを変更したことを覚えていない可能性があります。さらに、Bをステートメントから除外すると、他の人がコードを読んで改善するのが難しい場合があります。

0
Mike Foss