通常は「?」演算子は次の形式で使用されます。
A ? B : C
ただし、B = AI の場合、次の略語が見られます
A ? : C
これは驚くほど機能します。2番目のパラメータを(スタイルに関して)そのままにしておく方が良いですか、それとも特定のコンパイラがこれを処理できない可能性がありますか?
通常は「?」演算子は次の形式で使用されます。
A ? B : C
ただし、B = AI の場合、次の略語が見られます
A ? : C
これは驚くほど機能します。2番目のパラメータを(スタイルに関して)そのままにしておく方が良いですか、それとも特定のコンパイラがこれを処理できない可能性がありますか?
言語Cでは許可されていませんが(私が知る限り)、gccなどのコンパイラには拡張子としてショートカットa?:cがあります。
a?:cと同じ意味a?a:cです。
少し記入します。
この規格では、条件演算子という用語を使用しています。
構文
条件式:
論理OR式
論理OR式?式:条件式
条件式は左辺値を生成しません。また; ウィキペディア; 条件付き
注:つまり、C ++には次のものがあります:
論理OR式?式:代入-式
制約:
*最初のオペランドはスカラー型[1]でなければなりません。
*次のいずれかが2番目と3番目のオペランドに当てはまります。
—両方のオペランドの算術型は[2]です。
—両方のオペランドは同じ構造体[3]または共用体タイプ[4]を持っています;
—両方のオペランドのvoid型[5] ;
—両方のオペランドは、互換性のある修飾または非修飾[6]バージョンへのポインタです。
タイプ[7];
— 1つのオペランドはポインターで、もう1つはnullポインター定数です[8] ; また
— 1つのオペランドは、オブジェクトまたは不完全な型[9]へのポインターであり、もう1つのオペランドは
voidの修飾バージョンまたは非修飾バージョンへのポインタです。
フットフード:
[1]スカラー型:算術型とポインタ型。
[2]算術型:整数型と浮動型。
[3]構造タイプ:順次割り当てられた空でないメンバーオブジェクトのセット(および、
特定の状況、不完全な配列)、それぞれに
オプションで指定された名前と、場合によっては個別のタイプ。
[4]共用体タイプ:重複する空でないメンバーオブジェクトのセット。
オプションで指定された名前と、場合によっては個別のタイプ。
[5] Voidタイプ:空の値のセット。それはできない不完全なタイプです
完了しました。
[6]修飾型:1998(constおよびvolatile)、1999(restrict)、それぞれ
2011(_Atomic)。*
[7]互換性のあるタイプ:それらのタイプは同じです。
[8]ヌルポインタ。const .: NULL; 実装定義のnullポインタ定数。
[9]不完全なタイプ:オブジェクトを説明するが、決定するために必要な情報が不足しているタイプ
それらのサイズ。
* Cでの型修飾子
だから:使用するのは賢明ではありません。
私がひどく間違っていない限り、あなたはコンパイラ拡張機能 (おそらく gcc) を使用しています。標準では、3 項演算子の 2 番目のオペランドを省略できないと確信しています。
ウィキペディアによると、私はウェブで少し調査を行いました.この動作はCのGNU拡張によってサポートされています. http://en.wikipedia.org/wiki/%3F:#C
したがって、他のコンパイラがこれを違法と見なす可能性は非常に高いです。ちなみに、この演算子は三項条件と呼ばれているので、ブラウジングできます。
編集:
gcc と Apple llvm をチェックインしたところ、問題なく動作しました。
2 番目のパラメーターはそのままにしておくことをお勧めします。B が変更された場合、上記のステートメントを変更することを覚えていない可能性があります。さらに、ステートメントから B を除外すると、他の人がコードを読んで改善するのに苦労する可能性があります。