也许我不是来自这个星球,但在我看来,以下应该是语法错误:
int a[] = {1,2,}; //extra comma in the end
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.我很惊讶,当编译这段代码在Visual Studio中,但我已经学会了不至于C++规则而言信任MSVC的编译器,所以我检查的标准,它是标准允许为好.如果你不相信我,你可以看到8.5.1的语法规则.

为什么允许这样做?这可能是一个愚蠢无用的问题,但我希望你理解我为什么这么问.如果它是一般语法规则的子案例,我会理解 - 他们决定不再使一般语法更难以在初始化列表的末尾禁止冗余逗号.但不,明确允许附加逗号.例如,在函数调用参数列表的末尾(当函数采用时...)不允许使用冗余逗号,这是正常的.
那么,是否有任何特殊原因明确允许这个冗余逗号?
许多编程语言允许在列表中的最后一项之后的语法中使用尾随逗号.据说这是为了简化自动代码生成,这是可以理解的.
例如,以下是Java中完全合法的数组初始化(JLS 10.6数组初始化器):
int[] a = { 1, 2, 3, };
Run Code Online (Sandbox Code Playgroud)
我很好奇是否有人知道哪种语言首先允许使用这些尾随逗号.显然C 早在1985年便有它.
此外,如果有人知道现代编程语言的其他语法"特性",我也会非常有兴趣听到这些语言.我读到例如Perl和Python在语法的其他部分允许使用尾随逗号更加自由.