int a [] = {1,2,};允许使用逗号逗号。任何特别的原因? [英] int a[] = {1,2,}; Weird comma allowed. Any particular reason?

查看:197
本文介绍了int a [] = {1,2,};允许使用逗号逗号。任何特别的原因?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Maybe I am not from this planet, but it would seem to me that the following should be a syntax error:

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

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

But it's not. I was surprised when this code compiled on Visual Studio, but I have learnt not to trust MSVC compiler as far as C++ rules are concerned, so I checked the standard and it is allowed by the standard as well. You can see 8.5.1 for the grammar rules if you don't believe me.

为什么允许这样做?这可能是一个愚蠢的无用的问题,但我想让你了解为什么我问。如果它是一个一般语法规则的子情形,我会理解 - 他们决定不让一般语法更困难,只是在初始化列表的末尾不允许一个冗余的逗号。但不能,额外的逗号是显式 允许。例如,不允许在函数调用参数列表的末尾有一个多余的逗号(当函数 ... 时), which是正常的

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.

再次,是有任何特别的原因,这个冗余的逗号是显式 允许?

So, again, is there any particular reason this redundant comma is explicitly allowed?

推荐答案

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

It makes it easier to generate source code, and also to write code which can be easily extended at a later date. Consider what's required to add an extra entry to:

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

...您必须将逗号添加到现有行添加新行。比较三个已经后面有逗号的情况,你只需要添加一行。同样,如果你想删除一行,你可以这样做,而不必担心它是否是最后一行,并且你可以重新排序行没有freetling用逗号。基本上,这意味着如何处理行的一致性。

... you have to add the comma to the existing line and add a new line. Compare that with the case where the three already has a comma after it, where you just have to add a line. Likewise if you want to remove a line you can do so without worrying about whether it's the last line or not, and you can reorder lines without fiddling about with commas. Basically it means there's a uniformity in how you treat the lines.

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

Now think about generating code. Something like (pseudo-code):

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

无需担心您输出的当前项是第一个还是最后一个。更简单。

No need to worry about whether the current item you're writing out is the first or the last. Much simpler.

这篇关于int a [] = {1,2,};允许使用逗号逗号。任何特别的原因?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆