首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么悬空的逗号仍然是一件事?

为什么悬空的逗号仍然是一件事?
EN

Stack Overflow用户
提问于 2022-02-14 15:06:53
回答 2查看 181关注 0票数 0

很久以前,我在一门计算机科学课程中写了一个C编译器。工作的一部分涉及到使用Backus (,BNF,)中的C语法,比如。令我感到奇怪的是,初始化程序列表的语法允许列表以逗号结尾(所谓的悬空逗号)。我在我的编译器和其他编译器上尝试了它,并确认它是允许的。

示例:

代码语言:javascript
复制
<initializer> ::= <assignment-expression>
            | { <initializer-list> }
            | { <initializer-list> , }

在C中:

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

我的问题是:时至今日,悬挂的逗号仍然是C语言的一部分,其他语言也是如此。为什么不把它们移走?(假设他们没有任何“适当的”函数(我可能错了),为什么他们会传播到其他语言?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-14 15:14:34

为什么不把它们移走?

我不知道是否考虑过这样的搬迁。我不知道有什么理由会考虑这样的搬迁。

更进一步说,如果它们还不存在的话,就有很好的理由添加它们。它们是有用的。事实上,后面的逗号已经在标准修订中添加到了以前不允许使用的其他语言列表中。例如枚举(C99、C++11)。此外,还有一些建议将它们添加到更多的列表中,如成员输入列表。我更希望看到它们被允许,例如在函数调用中,就像在其他语言中所允许的那样。

允许使用后缀逗号的一个原因是,当程序被修改时,更容易修改(减少工作;减少出错的机会)和干净的差异。

以下是一些例子..。

不带逗号的旧版本:

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

新版本:

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

迪夫:

代码语言:javascript
复制
<     3
---
>     3,
>     4

带有后缀逗号的旧版本:

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

新版本:

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

迪夫:

代码语言:javascript
复制
>     4,
票数 8
EN

Stack Overflow用户

发布于 2022-02-14 15:27:39

允许终端逗号是有用的。给出了一些清单:

代码语言:javascript
复制
int Codes[] =
{
    37,
    74,
    88,
};

然后:

  • 对于列表的人工维护,我们可以轻松地添加或删除行,而无需使用逗号。如果不允许终端逗号,则追加一个新行还需要编辑退出的上一行以添加逗号,而删除最后一行还需要编辑前一行以删除逗号。
  • 对于机器生成的列表,我们不需要在生成列表的循环中包含代码以区别对待最后一个列表项。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71113967

复制
相关文章

相似问题

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