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

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.

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


当前回答

由于向后兼容的原因,我认为允许使用尾随逗号。有很多现有的代码,主要是自动生成的,它们在后面放了一个逗号。它使得在结尾没有特殊条件的情况下更容易编写循环。 如。

for_each(my_inits.begin(), my_inits.end(),
[](const std::string& value) { std::cout << value << ",\n"; });

这对程序员来说并没有什么好处。

附注:虽然这样更容易自动生成代码,但实际上我总是注意不要在后面加上逗号,这样做的工作量最小,可读性得到了提高,这是更重要的。你写了一次代码,你读了很多次。

其他回答

因此,当两个人在不同分支的列表中添加一个新项目时,Git可以正确地合并这些更改,因为Git是按行工作的。

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

它使代码编辑变得容易得多。 我比较editinc c/c++数组元素与编辑json文档-如果你忘记删除最后一个逗号,json将不会解析。(是的,我知道JSON不能手动编辑)

它使生成代码更容易,因为您只需要添加一行,而不需要将添加最后一个条目视为特殊情况。在使用宏生成代码时尤其如此。有一种努力试图从语言中消除对宏的需求,但许多语言确实是与可用的宏一起发展的。额外的逗号允许定义和使用以下宏:

#define LIST_BEGIN int a[] = {
#define LIST_ENTRY(x) x,
#define LIST_END };

用法:

LIST_BEGIN
   LIST_ENTRY(1)
   LIST_ENTRY(2)
LIST_END

这是一个非常简单的示例,但宏通常使用此模式来定义分派、消息、事件或转换映射和表等内容。如果结尾不允许用逗号,我们需要一个特殊的:

#define LIST_LAST_ENTRY(x) x

用起来会很尴尬。

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

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

只是变成了:

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

在晚些时候。