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

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

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

Why is this allowed? This may be a stupid useless question but I want you to understand why I am asking. If it were a sub-case of a general grammar rule, I would understand - they decided not to make the general grammar any more difficult just to disallow a redundant comma at the end of an initializer list. But no, the additional comma is explicitly allowed. For example, it isn't allowed to have a redundant comma in the end of a function-call argument list (when the function takes ...), which is normal.

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


当前回答

我一直认为这样可以更容易地添加额外的元素:

int a[] = {
            5,
            6,
          };

只是变成了:

int a[] = { 
            5,
            6,
            7,
          };

在晚些时候。

其他回答

除了代码生成和编辑方便之外,如果您想实现解析器,这种类型的语法更简单、更容易实现。c#在一些地方遵循这个规则,比如在枚举定义中有一个以逗号分隔的项目列表。

据我所知,允许这样做的原因之一是自动生成代码应该很简单;最后一个元素不需要任何特殊处理。

如果你使用一个没有指定长度的数组,vc++ 6.0可以自动识别它的长度,所以如果你使用"int a[]={1,2,};", a的长度是3,但最后一个还没有初始化,你可以使用"cout<

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

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

... 您必须在现有行中添加逗号,并添加新行。与“3”后面已经有逗号的情况相比,你只需要添加一行。同样地,如果你想删除一行,你可以不用担心它是否是最后一行,你可以重新排序而不用用逗号。基本上,这意味着你对待线条的方式是一致的。

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

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

不需要担心您正在输出的当前项是第一个还是最后一个。更加简单。

原因很简单:添加/删除行很容易。

想象下面的代码:

int a[] = {
   1,
   2,
   //3, // - not needed any more
};

现在,您可以轻松地向列表中添加/删除项目,而不必有时添加/删除后面的逗号。

与其他答案相反,我真的不认为生成列表的便性是一个有效的理由:毕竟,代码对最后(或第一行)行进行特殊处理是微不足道的。代码生成器只编写一次,并使用多次。