int i=1,2,3,4; // Compile error
// The value of i is 1
int i = (1,2,3,4,5);
// The value of i is 5
C における i のこれらの定義の違いは何ですか? また、それらはどのように機能しますか?
編集:最初のものはコンパイルエラーです。2番目はどのように機能しますか?
=
,
1よりも優先されます。したがって、最初のステートメントは次の宣言と初期化ですi
。
int i = 1;
… 何もしないカンマ区切りの式がたくさん続きます。
一方、2 番目のコードは、1 つの宣言とそれに続く1 つの初期化式で構成されています (括弧が優先されるため、 と のそれぞれの優先順位は関係,
あり=
ません)。
繰り返しますが、最初のコードは C でも C++ でも有効ではないため、これは純粋に学術的なものです。このコードを受け入れるために使用しているコンパイラがわかりません。私の(当然のことながら)不平を言う
エラー: 数値定数の前に unqualified-id が必要です
1 C++ の優先順位規則は、演算子の使用方法に関係なく適用されます。=
およびOP のコードでは、または,
を参照しないでください。それにもかかわらず、それらはC++ に関する限り演算子であり (標準の §2.13)、トークンの優先順位はその使用法に依存しません。セマンティクスに関係なく、は常によりも優先順位が低くなります。operator=
operator,
=
,
,
=
C++についてはわかりませんが、少なくともCの場合、最初の構文は無効な構文であるため、コンパイルされないため、宣言について実際に話すことはできません. 2 つ目は、コンマ演算子の誤用であり、結果は 5 です。
したがって、率直に言って、違いは、最初のものは C ではなく、2 番目のものは C であるということです。
コンマ演算子 ( ,
) の興味深いエッジ ケースに遭遇しました。
基本的に、前のステートメントの結果を取得して破棄し、次のステートメントに置き換えます。
コードの最初の行の問題はoperator precedence
. =
演算子は演算子よりも優先順位が高いため,
、コンマ チェーン (1) の最初のステートメントの結果が得られます。
修正 (@jrok に感謝します!) - コードの最初の行はコンパイルされず、コンマを演算子として使用するのではなく、一度に同じ型の複数の変数名を定義できる式区切りとして使用されます。
2 番目の例では、最初の値がすべて破棄され、一連のアイテム (5)の最終結果が得られます。