?:
C の演算子は C++ ではわずかに異なり、両方の言語で動作が異なるソース コードがあることをどこかで読みました。残念ながら、テキストはどこにも見つかりません。この違いが何かわかる人いますか?
2 に答える
C++ の条件演算子は左辺値を返すことができますが、C では同様の機能が許可されていません。したがって、以下は C++ で有効です。
(true ? a : b) = 1;
これを C で複製するには、if/else に頼るか、参照を直接処理する必要があります。
*(true ? &a : &b) = 1;
また、C++ では、?:
and=
演算子の優先順位は等しく、右から左にグループ化されます。
(true ? a = 1 : b = 2);
は有効な C++ コードですが、C では最後の式を括弧で囲まないとエラーがスローされます。
(true ? a = 1 : (b = 2));
実際の主な違いは、C では ?: の評価が左辺値になることはありませんが、C++ ではそうであるということです。
その定義には、実際的な影響がほとんどない他の違いがあります。C++ では、最初のオペランドは bool に変換され、C では 0 と比較されます。これは、C と C++ の間の ==、!= などの定義の違いに似ています。
C++ には、2 番目と 3 番目のオペランドの型に基づいて ?: 式の型を推測するためのより複雑な規則もあります。これは、C++ でのユーザー定義の暗黙的な変換の可能性を反映しています。
サンプルコード。有効な C++; 無効な C。
extern int h(int p, int q);
int g(int x)
{
int a = 3, b = 5;
(x ? a : b) = 7;
return h( a, b );
}
gcc
C としてコンパイルすると、「エラー: 代入の左辺値が無効です」というエラーが生成されますが、C++ としてコンパイルすると、コードはエラーなしでコンパイルされます。
編集: ?: は C で左辺値を返すことはできませんが、驚くべきことに ?: の文法は次のとおりです。
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
これは、(「左辺値ではない」規則により) 有効な式を結果として得られないにもかかわらず、a ? b : c = d
解析することを意味します。(a ? b : c) = d
C++ は文法を次のように変更します。
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
一部の状況で conditional-expression を左辺値にすることを許可する拡張機能はa ? b : c = d
、文法を変更しなくても有効になりますが、新しい文法変更により、式が有効になりましたが、 の意味が異なりa ? b : (c = d)
ます。
証拠はありませんが、文法の変更によって既存の C コードとの互換性が損なわれることはなかったので、新しい文法では次のような表現で驚きが少なくなる可能性が高いと考えられます。
make_zero ? z = 0 : z = 1;