很久以前,我在一门计算机科学课程中写了一个C编译器。工作的一部分涉及到使用Backus (,BNF,)中的C语法,比如这。令我感到奇怪的是,初始化程序列表的语法允许列表以逗号结尾(所谓的悬空逗号)。我在我的编译器和其他编译器上尝试了它,并确认它是允许的。
示例:
<initializer> ::= <assignment-expression>
| { <initializer-list> }
| { <initializer-list> , }在C中:
int array[] = { 1, 2, 3, };我的问题是:时至今日,悬挂的逗号仍然是C语言的一部分,其他语言也是如此。为什么不把它们移走?(假设他们没有任何“适当的”函数(我可能错了),为什么他们会传播到其他语言?)
发布于 2022-02-14 15:14:34
为什么不把它们移走?
我不知道是否考虑过这样的搬迁。我不知道有什么理由会考虑这样的搬迁。
更进一步说,如果它们还不存在的话,就有很好的理由添加它们。它们是有用的。事实上,后面的逗号已经在标准修订中添加到了以前不允许使用的其他语言列表中。例如枚举(C99、C++11)。此外,还有一些建议将它们添加到更多的列表中,如成员输入列表。我更希望看到它们被允许,例如在函数调用中,就像在其他语言中所允许的那样。
允许使用后缀逗号的一个原因是,当程序被修改时,更容易修改(减少工作;减少出错的机会)和干净的差异。
以下是一些例子..。
不带逗号的旧版本:
int array[] = {
1,
2,
3
};新版本:
int array[] = {
1,
2,
3,
4
};迪夫:
< 3
---
> 3,
> 4带有后缀逗号的旧版本:
int array[] = {
1,
2,
3,
};新版本:
int array[] = {
1,
2,
3,
4,
};迪夫:
> 4,发布于 2022-02-14 15:27:39
允许终端逗号是有用的。给出了一些清单:
int Codes[] =
{
37,
74,
88,
};然后:
https://stackoverflow.com/questions/71113967
复制相似问题