使用逗号运算符是一种好习惯吗?

Joh*_*0te 12 c c++ operators

我最近(实际上仅在SO上)遇到了C/C++逗号运算符的使用.据我所知,它在左侧和右侧操作符之间的线上创建了一个序列点,以便您具有可预测(定义)的评估顺序.

我有点困惑为什么会在语言中提供这个,因为它似乎是一个可以应用于首先不起作用的代码的补丁.我发现很难想象它可以被使用的地方不是太复杂(并且需要重构).

有人可以解释这种语言功能的目的,以及它可以在实际代码中使用的位置(在合理范围内),如果有的话?

caf*_*caf 17

它在while()循环条件下很有用:

while (update_thing(&foo), foo != 0) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

这样可以避免必须复制该update_thing()行,同时仍然在while()控制表达式中保持退出条件,您希望在其中找到它.它也很好玩continue;.

它在编写计算值的复杂宏时也很有用.


Set*_*gie 9

逗号运算符只是分隔表达式,因此您可以执行多项操作,而不只是只需要一个表达式的操作.它可以让你做的事情

             (x)              (y)
for (int i = 0, j = 0; ...; ++i, ++j)
Run Code Online (Sandbox Code Playgroud)

请注意,这x不是逗号运算符,而是y.

你真的不必考虑它.它有一些更神秘的用途,但我不相信它们是绝对必要的,所以它们只是好奇心.


Tom*_*err 6

for循环结构中,它是有意义的.虽然我通常发现在这种情况下难以阅读.

这对于激怒你的同事和人们来说也非常方便.

bool guess() {
  return true, false;
}
Run Code Online (Sandbox Code Playgroud)

  • 变量声明中的逗号是*不*使用逗号*运算符*,它产生值. (4认同)

Jos*_*sey 5

扮演恶魔代言人,把问题倒过来可能是合理的:

总是使用分号终止符是一种好习惯吗?

几点:

  • 用逗号代替大多数分号会立即使大多数 C 和 C++ 代码的结构更加清晰,并且会消除一些常见错误。
  • 这更像是函数式编程的风格,而不是命令式。
  • Javascript 的“自动分号插入”是其有争议的语法特性之一。

这种做法是否会增加“常见错误”尚不得而知,因为没有人这样做。

但当然,如果你这样做,你可能会惹恼你的程序员同事,并成为 SO 的贱民。

编辑: 请参阅AndreyT 在2009 年对Uses of C 逗号运算符出色回答。而乔尔2008年还谈到一点关于两个平行句法类在C#/ C / C ++。

作为一个简单的例子, 的结构while (foo) a, b, c;很清楚,但while (foo) a; b; c;在没有缩进或大括号或两者的情况下会产生误导。

编辑 #2:正如AndreyT所说:

[The] C 语言(以及 C++)在历史上是两种完全不同的编程风格的混合,可以将其称为“语句编程”和“表达式编程”。

但他的说法,“在实践中陈述编程产生多少更可读的代码” [强调]显然是假的。以他的例子为例,在您看来,以下两行哪一行更具可读性?

a = rand(), ++a, b = rand(), c = a + b / 2, d = a < c - 5 ? a : b;
a = rand(); ++a; b = rand(); c = a + b / 2; if (a < c - 5) d = a; else d = b; 
Run Code Online (Sandbox Code Playgroud)

:他们无法读取。正是空白赋予了可读性——为 Python 欢呼吧!第一个较短。但是如果您有 Hazeltine 终端,分号版本确实有更多像素的黑色空间绿色空间——这可能是真正的问题吗?