提问者:小点点

int a[]={1,2,};允许奇怪的逗号。有什么特别的原因吗?


也许我不是来自这个星球,但在我看来,下面的应该是一个语法错误:

int a[] = {1,2,}; //extra comma in the end

但事实并非如此。当这段代码在Visual Studio上编译时我感到很惊讶,但是我已经学会了就C++规则而言不信任MSVC编译器,所以我检查了标准,它也是标准允许的。如果你不相信我,你可以看8.5.1的语法规则。

为什么允许这样做?这可能是一个愚蠢无用的问题,但我想让你明白我为什么要问。如果这是一个通用语法规则的子例,我会理解的--他们决定不让通用语法变得更困难,只是在初始值列表的末尾不允许一个多余的逗号。但不是,则显式允许附加逗号。例如,不允许在函数调用参数列表的末尾有多余的逗号(当函数使用...),这是正常的。

那么,再一次,有什么特别的原因明确允许这个多余的逗号吗?


共2个答案

匿名用户

它使生成源代码变得更加容易,也使编写以后可以轻松扩展的代码变得更加容易。考虑添加额外条目所需的条件:

int a[] = {
   1,
   2,
   3
};

...您必须在现有行中添加逗号并添加新行。把它和三个字母后面已经有逗号的情况比较一下,你只需要加一行就可以了。同样,如果您想删除一行,您可以这样做,而不必担心它是否是最后一行,您也可以重新排列行,而不必摆弄逗号。基本上这意味着你对待线条的方式是一致的。

现在考虑生成代码。类似于(伪代码):

output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

不需要担心当前写出的项目是第一个还是最后一个。简单多了。

匿名用户

这样做很有用:

int a[] = {
  1,
  2,
  3, //You can delete this line and it's still valid
};