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

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[] = {
  1,
  2,
  3, //You can delete this line and it's still valid
};

其他回答

它使得生成数组或枚举的代码生成器更容易。

想象一下:

std::cout << "enum Items {\n";
for(Items::iterator i(items.begin()), j(items.end); i != j; ++i)
    std::cout << *i << ",\n";
std::cout << "};\n";

也就是说,不需要对第一项或最后一项进行特殊处理,以避免出现尾随逗号。

例如,如果代码生成器是用Python编写的,使用str.join()函数可以很容易地避免吐出尾随逗号:

print("enum Items {")
print(",\n".join(items))
print("}")

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

想象下面的代码:

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

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

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

唯一在实践中不被允许的语言是Javascript,它会导致无数的问题。例如,如果你从数组中间复制粘贴一行,粘贴到末尾,并且忘记删除逗号,那么你的网站将对IE访问者完全崩溃。

*理论上这是允许的,但ie浏览器不遵循标准,并将其视为错误

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

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

只是变成了:

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

在晚些时候。

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