多余的逗号?

晚上看了两页 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 这篇文章进行了一个很有意思的讨论。

  1. 2009年5月8日08:26 | #1

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

  2. gleery
    2009年5月8日10:55 | #2

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

  3. 2009年5月8日13:42 | #3

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

  4. nick
    2009年5月8日14:19 | #4

    python不就有么,而且只有一个元素的tuple还是必须的

  5. 2009年5月9日10:35 | #5

    wow,你的学习材料都是英文的呀?

  6. 2009年5月9日13:30 | #6

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

  7. Solrex Yang
    2009年5月9日22:28 | #7

    @solar panels
    其实对于程序员来说,大部分学习资料都是英文的。

  8. Solrex Yang
    2009年5月9日22:35 | #8

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

  9. 2009年5月15日14:57 | #9

    不懂这有什么用?

  10. chu
    2009年5月27日11:16 | #10

    Lua 也支持这种特性,Json 似乎也支持。

  11. 2009年10月1日20:41 | #11

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

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
说明:点击回复/引用, 会发邮件给该用户, 请慎用; 填写非真实电邮地址, 评论可能会被自动过滤, 无法及时显示, 不要责怪我. 卡内基梅隆大学的 reCAPTCHA 计划使用验证码帮助辨认古老典籍扫描时无法识别的文字,输入验证码的同时,您也为保存人类知识做了一分贡献,谢谢!