【发布时间】:2011-10-25 23:33:25
【问题描述】:
也许我不是来自这个星球,但在我看来,以下应该是语法错误:
int a[] = {1,2,}; //extra comma in the end
但事实并非如此。当这段代码在 Visual Studio 上编译时我很惊讶,但我已经学会了不信任 MSVC 编译器就 C++ 规则而言,所以我检查了标准,它是标准也允许。不信可以看8.5.1的语法规则。
为什么允许这样做?这可能是一个愚蠢无用的问题,但我想让你明白我为什么要问。如果它是一般语法规则的子案例,我会理解 - 他们决定不让一般语法变得更加困难,只是不允许在初始化列表末尾使用多余的逗号。但是不,额外的逗号明确是允许的。例如,函数调用参数列表的末尾不允许有多余的逗号(当函数采用...时),这是正常的。
那么,再次明确允许这种多余的逗号有什么特别的原因吗?
【问题讨论】:
-
每个人似乎都同意“易于添加新行” - 但是定义语言规范的人们真的会为这些事情烦恼吗?如果他们真的那么理解,那么当很明显下一个标记实际上是下一个语句时,他们为什么不忽略丢失的
;。 -
@YetAnotherUser:是的,语言设计者会考虑这样的事情。允许您删除分号会产生更大的影响,并且在语言的许多部分中会非常模棱两可(请记住,空格在 C 中不是语义)。一个额外的逗号是这种情况并不模棱两可。额外的分号几乎不会有歧义,因此也是允许的。在不明确的情况下(例如在
for()之后),添加它会引发编译器警告。 -
@Tomalak:这对人类读者来说是模棱两可的,而且经常是一个错误。这就是为什么它会发出警告。同样
if (x = 1)在语法上没有歧义,但对人类来说非常歧义,因此会抛出警告。 -
@Rob:您的
if示例也没有歧义。我不认为“模棱两可”意味着你认为它的意思! -
只要我们同意它对编译器保护我们是有用的,而数组声明中的尾随逗号对编译器保护我们没有用处。
标签: c++ syntax grammar language-lawyer