【发布时间】:2017-01-18 18:36:49
【问题描述】:
我在看C Programming Language,发现这句话:
声明中分隔 ... 变量的逗号不是逗号运算符,不保证从左到右求值。
如果是,它们是否是这段代码中的逗号运算符?
int a=1, b=a+1, c=b+a+1, d=c+b+a+1;
我很确定它会起作用。但是如果它们不是逗号运算符,并且不能保证从左到右的顺序,那么上面的语句可能会失败,对吧?
【问题讨论】:
-
声明也按顺序工作。更有趣的情况是
f(a += b, a)。 -
这行得通。但是,从风格上讲,我不喜欢使用逗号声明,而是喜欢这样做:
int a = 1;int b = a + 1;int c = b + a + 1;int d = c + b + a + 1;[在单独的行]。我读过的大多数风格指南也更喜欢分割线方法。 IMO,在查看大量代码时,使用逗号更难阅读/理解[快速]。对我来说,sequential 的意图更加清晰。其他人,看到逗号可能不得不研究这个,就像你的问题一样。另请注意,我还添加了一些空白作为视觉辅助。 -
我认为
f(a += b, a)是一种糟糕的编码风格,因为它已经被大量讨论过不要像printf("%d, %d\n", a++, a++);那样使用,而且C 标准也不能保证结果。但是我没有看到关于int a = 1, b = a + 1 ...的相同讨论,这就是我问这个问题的原因。 -
同意这不是好的编码风格。但仍然想弄清楚它是否总是有效。 :-)
-
@KerrekSB 函数调用中的逗号不是“逗号运算符”,并且不能保证顺序(事实上,在 80 年代使用蒸汽驱动的 C 编译器时,它很可能是相反的顺序,因为参数是从右向左推送的——但从来没有任何保证)。
标签: c comma-operator