多余的逗号?

晚上看了两页 The Art of Unix Programming,其中提到了一个我以前一直感觉困惑的地方:

在我看过的 C/C++ 语言程序代码中,为什么有的列表初始化时在最后元素后会加逗号“,”,而有的不会?
例如:int[] a = { 1, 2, 3, };

书中的原话倒不是讨论逗号该不该加,而是说到了这样做能带来的好处:

A good example is C accommodating an extra comma at the end of an array initializer list, which makes both editing and machine generation of array initializers much easier.
-- The Art of Unix Programming (TAOUP) Ch8.3.1

哦,虽然我一直体会到这样做的好处(尤其当列表成员又臭又长且要经常修改时),也晓得这样做不会引起编译错误,但我经常是在代码 stable 之后将最后的逗号去掉——原因无它,不确定这样做是不是没有问题,那么还是尽量避免吧。今天忽然看到 TAOUP 提到这个,我就好奇:到底是 C/C++ 标准允许这样做呢?还是编译器的实现大部分支持这样做?于是就查了一下。

结果让我很开心,C/C++ 标准中就允许这样做:

initializer:
    assignment-expression
    { initializer-list }
    { initializer-list , }

-- ISO/IEC 9899:1999 (C99) Ch6.7.8 §1

initializer-clause:
    assignment-expression
    { initializer-list ,opt }
    { }

-- ISO/IEC 14882:1998 (C++98) Ch8.5 §1

K&R 中也用非常简短的一句话提到了这个特性:

A list may end with a comma, a nicety for neat formatting.
-- The C Programming Language (K&R) Appendix 8.7

这意味着(C/C++ 语言中)在元素列表最后加上一个逗号是一件非常安全的事情,看来我以后不必再考虑删除列表最后那个逗号了,这样能省却我很多麻烦。

延伸阅读:在其它编程语言中,是否支持这样做呢?Arrays: additionnal commas 这篇文章进行了一个很有意思的讨论。

《多余的逗号?》上有11条评论

  1. 而且在打字习惯上可以输入一个元素后接着打逗号空格,有这样的习惯也能避免出错

  2. 允许末尾多一个都好对于解析的代码来说也是很好的主意呢~,不过在js里面却很讨厌~,老师要注意末尾的,

  3. 晕,还真不知道C++列表初始化时在最后元素后可以加逗号“,”。
    C#用多了,回头试试看C#可不可以这个样子

  4. 对啊, SQL不支持这特性, 所以Create语句编辑时(增删字段)非常痛苦. 似乎JavaScript也不支持.

  5. @ideawu
    但是不知道 SQL 不支持此特性有没有什么好的原因,把多余的符号用作其它用途也是有可能的。

  6. 《C缺陷与陷阱》有一道题目就是问多加一个逗号的好处是什么?原来如此。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注