C 逗号运算符的使用

新手上路,请多包涵

您会看到它在 for 循环语句中使用,但它在任何地方都是合法的语法。如果有的话,你在其他地方发现了它的什么用途?

原文由 pythonic metaphor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 547
2 个回答

C 语言(以及 C++)在历史上是两种完全不同的编程风格的混合体,可以称为“语句编程”和“表达式编程”。如您所知,每种过程式编程语言通常都支持诸如 排序分支 之类的基本结构(请参阅 结构化编程)。这些基本结构以两种形式出现在 C/C++ 语言中:一种用于语句编程,另一种用于表达式编程。

例如,当您根据语句编写程序时,您可能会使用由 ; 分隔的语句序列。当你想做一些分支时,你使用 if 语句。您还可以使用循环和其他类型的控制转移语句。

在表达式编程中,您也可以使用相同的结构。这实际上是 , 运算符发挥作用的地方。运算符 , 只不过是C中顺序表达式的分隔符,即运算符 , 在表达式编程中的作用与 ; 在语句编程中的作用相同。表达式编程中的分支是通过 ?: 运算符完成的,或者通过 &&|| 运算符的短路评估属性完成。 (虽然表达式编程没有循环。要用递归替换它们,您必须应用语句编程。)

例如下面的代码

a = rand();
++a;
b = rand();
c = a + b / 2;
if (a < c - 5)
  d = a;
else
  d = b;

这是传统语句编程的一个示例,可以根据表达式编程重写为

a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? d = a : d = b;

或作为

a = rand(), ++a, b = rand(), c = a + b / 2, d = a < c - 5 ? a : b;

或者

d = (a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? a : b);

或者

a = rand(), ++a, b = rand(), c = a + b / 2, (a < c - 5 && (d = a, 1)) || (d = b);

不用说,在实践中,语句编程通常会生成可读性更高的 C/C++ 代码,因此我们通常会在非常精确且数量有限的情况下使用表达式编程。但在许多情况下,它会派上用场。可接受与不可接受之间的界限在很大程度上取决于个人偏好以及识别和阅读成语的能力。

作为附加说明:语言的设计显然是针对语句量身定制的。语句可以自由调用表达式,但表达式不能调用语句(除了调用预定义函数)。这种情况在 GCC 编译器中以一种相当有趣的方式发生了变化,它支持所谓的 “语句表达式” 作为扩展(与标准 C 中的“表达式语句”对称)。 “语句表达式”允许用户直接将基于语句的代码插入到表达式中,就像他们可以将基于表达式的代码插入到标准 C 中的语句中一样。

作为另一个附加说明:在 C++ 语言中,基于函子的编程起着重要作用,可以看作是“表达式编程”的另一种形式。根据 C++ 设计的当前趋势,在许多情况下,它可能被认为比传统的语句编程更可取。

原文由 AnT stands with Russia 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为通常 C 的逗号不是一种好用的样式,因为它很容易被忽略 - 要么是其他人试图阅读/理解/修复你的代码,要么是你自己一个月后。当然,在变量声明和 for 循环之外,它是惯用的。

例如,您可以使用它来将多个语句打包成一个三元运算符 (?:),ala:

 int x = some_bool ? printf("WTF"), 5 : fprintf(stderr, "No, really, WTF"), 117;

但是我的上帝,为什么?!? (我已经看到它在实际代码中以这种方式使用,但不幸的是无法访问它来显示)

原文由 Jack Lloyd 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题