多分私はこの惑星の出身ではないかもしれませんが、以下は構文エラーであるように思えます:
int a[] = {1,2,}; //extra comma in the end
しかし、そうではありません。このコードがVisual Studioでコンパイルされたときは驚きましたが、C ++のルールに関してはMSVCコンパイラを信頼しないことを学んだので、標準を確認しましたが、標準でも許可されています。あなたが私を信じないなら、あなたは文法規則のために8.5.1を見ることができます。
なぜこれが許可されるのですか?これは愚かな役に立たない質問かもしれませんが、なぜ私が尋ねているのか理解して欲しいのです。それが一般的な文法規則のサブケースである場合、私は理解するだろう-彼らは、初期化子リストの末尾に冗長なコンマを許可しないために、一般的な文法をこれ以上難しくしないことに決めました。ただし、追加のコンマは明示的に許可されています。たとえば、関数呼び出しの引数リストの最後に冗長なコンマを含めることはできません(関数がを受け取る場合...
)。これは正常です。
繰り返しますが、この冗長なコンマが明示的に許可されている特別な理由はありますか?
for()
たとえばの後)に追加すると、コンパイラ警告がスローされます。
if (x = 1)
に、文法ではあいまいではありませんが、人間にとってはあいまいであるため、警告がスローされます。
if
例も曖昧ではありません。「あいまい」とは、あなたの考えていることだとは思いません!
;
次のトークンが実際には次のステートメントであることが明らかな場合、欠落を無視しないのはなぜですか。