これは、複雑な C 文法の詳細に依存しているため、実際にはトリッキーな質問です。それを理解するための最良の情報源はドラフト標準です。Annex A
言語構文の概要を参照として使用できます。
基本的な考え方は次のとおりです。
int i=0,1,2;
は宣言であり、次のとおりです。
i = 0,1,2;
は表現です。
式では、左辺を評価し (通常は副作用の場合)、結果を破棄してから右辺を評価するコンマ演算子を使用できます。
宣言では、カンマはカンマ演算子ではなく文法上の区切り記号です。,
分離宣言子 および since1
および2
は、宣言のコンテキストでは宣言子ではありません。これは構文が正しくありません。
int i=0,1,2;
^^^^
C99 標準の関連する文法は次のとおりです。
init-declarator-list:
init-declarator
init-declarator-list , init-declarator <--- here comma is just a seperator
init-declarator:
declarator
declarator = initializer
したがって、この場合、宣言子または宣言子 = 初期化子のいずれかである可能性のある,
分離されたinit-declaratorは、宣言子でも宣言子でもないため、構文が正しくありません。1
2
初期化子が代入式になる可能性があることは何の価値もありませんが、この式は裸のコンマ演算子へ()
のパスを提供しません。セパレーター。
セクションの関連する文法6.5.17
は次のとおりです。
expression:
assignment-expression
expression , assignment-expression
コンマ演算子の説明は次のとおりです。
コンマ演算子の左側のオペランドは void 式として評価されます。その評価の後にシーケンス ポイントがあります。次に、右側のオペランドが評価されます。結果には型と値があります。[...]
次の式では、コンマ演算子の優先順位が最も低いことに注意してください。
i = 0,1,2;
次と同等です。
(i = 0),1,2;
i
の値が取得され、それ0
以降の評価の結果は破棄されます。