首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >int a[] = {1,2,};为什么允许在初始化器列表中使用尾随逗号?

int a[] = {1,2,};为什么允许在初始化器列表中使用尾随逗号?
EN

Stack Overflow用户
提问于 2011-08-13 00:36:31
回答 20查看 29.6K关注 0票数 352

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

代码语言:javascript
复制
int a[] = {1,2,}; //extra comma in the end

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

为什么允许这样做?这可能是一个愚蠢而无用的问题,但我希望你理解我为什么要问这个问题。如果这是一般语法规则的子格,我会理解的-他们决定不让一般语法变得更加困难,只是为了不允许在初始化器列表的末尾使用多余的逗号。但是没有,额外的逗号是明确允许的,。例如,不允许在函数调用参数列表的末尾有多余的逗号(当函数接受...时),这是正常的。

那么,有没有什么特别的原因让显式地允许使用这个多余的逗号呢?

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2011-08-13 00:39:47

它使得生成源代码和编写代码变得更容易,这些代码在以后可以很容易地扩展。考虑向添加一个额外的条目需要什么:

代码语言:javascript
复制
int a[] = {
   1,
   2,
   3
};

..。您必须在现有行中添加逗号,然后添加一个新行。相比之下,三个字符后面已经有一个逗号,您只需添加一行即可。同样地,如果你想删除一行,你可以不用担心它是否是最后一行,你也可以重新排序行,而不需要使用逗号。基本上,这意味着你对待线条的方式是一致的。

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

代码语言:javascript
复制
output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

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

票数 448
EN

Stack Overflow用户

发布于 2011-08-13 00:39:53

如果你这样做,它会很有用:

代码语言:javascript
复制
int a[] = {
  1,
  2,
  3, //You can delete this line and it's still valid
};
票数 128
EN

Stack Overflow用户

发布于 2011-08-13 00:40:58

开发人员的易用性,我认为。

代码语言:javascript
复制
int a[] = {
            1,
            2,
            2,
            2,
            2,
            2, /*line I could comment out easily without having to remove the previous comma*/
          }

此外,无论出于什么原因,如果您有一个工具可以为您生成代码,那么该工具不必关心它是否是初始化中的最后一项。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7043372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档