【问题标题】:Is there any practical semantic difference between the comma operator and the semicolon?逗号运算符和分号之间有什么实际的语义区别吗?
【发布时间】:2018-09-04 09:01:03
【问题描述】:

这是我目前所理解的:

  1. 逗号运算符允许代码简洁,例如int x = 0, y = 0, z = 0 而不是 int x = 0; int y = 0; int z = 0;。在这种情况下,它有点像分号的语法糖。

  2. 逗号运算符充当序列点。所以在代码f(), g(); 中,函数f() 保证在g() 之前执行并产生它的所有副作用。但如果你使用代码f(); g();,也是如此。

  3. 逗号运算符是一个运算符,而分号只是一个程序标记,不参与表达式的计算。由于逗号运算符的优先级如此之低,因此在这方面它与分号几乎没有区别。

那么,我想知道这两种结构在实践中的语义差异是什么?是否存在使用逗号与使用分号产生不同结果的情况?

【问题讨论】:

  • 在声明或定义变量时,逗号不是命令操作符,它只是不同声明之间的分隔符。
  • int x = 0, y = 0, z = 0不是逗号运算符
  • 请注意,逗号 operator 的语义在 C 和 C++ 中是不同的,因此请编辑您的问题以仅使用您真正想知道的语言标签。
  • 逗号将返回最后一个操作数的左值。如果你愿意,你可以编写像(b += 3, a) = 5; 这样的丑陋代码。
  • @liliscent,在 C++ 中,是的,但不适用于 C。这里,逗号运算符的结果是右值,因此您给出的示例无效。

标签: c operators comma-operator


【解决方案1】:

逗号运算符在其他答案中得到了很好的讨论。仍然是分号。

分号 (;) 是一个语句终止符,表示它终止任何语句的语法。这也意味着一个表达式,当后面跟一个分号时,就变成了一个语句:

foo();                // a statement
bar();                // a statement
3+5;                  // a statement
(t=3, t+2);           // a statement
while(foo(), bar());  // a statement

while(foo(), bar()) {
    ;                 // empty statement
}

分号也终止声明。

【讨论】:

    【解决方案2】:

    万一

    int x = 0, y = 0, z = 0 ;
    

    , 不是 逗号运算符,但它们是逗号分隔符。
    分号是语句和声明的一部分。

    int i = 0;  // declaration
    i = i + 5;  // statement
    

    另一方面,逗号运算符是表达式的一部分。也就是说,分号不能用在需要表达式的地方。例如

    if(++i, i < 10) { /*...*/ }  // A semicolon can't be used.
    

    【讨论】:

      【解决方案3】:

      它确实有所作为的一种情况是:

      while(foo(), bar()) {
          ...
      }
      

      我不知道这是否有任何真正的实际用途,但它确实用逗号编译,而不是用分号。

      【讨论】:

      • ..因为分号是语句终止符,不能出现在表达式中。
      【解决方案4】:

      有些情况下逗号用作标记,有些情况下逗号是comma operator

      引用维基百科,

      将逗号标记用作运算符不同于它在函数调用和定义、变量声明、枚举声明和类似构造中用作分隔符。

      一个需要澄清的例子,(直接从第 §6.5.17 章借用,C11 标准)

      你可以像这样调用函数

        f(a, (t=3, t+2), c);
      

      这里,(t=3, t+2) 中的逗号是逗号操作符,这是有效且可接受的。

      但是,你不能写

        f(a, (t=3; t+2), c);
      

      这是一个语法错误。

      【讨论】:

      • (t=3, t+2) 的右值结果是t+2 的值。逗号运算符是否有序列点?那么结果是5;否则它将是未定义的?
      • @PaulOgilvie ...我引用The left operand of a comma operator is evaluated as a void expression; there is a sequence point between its evaluation and that of the right operand. Then the right operand is evaluated; the result has its type and value
      • ...并且左操作数可以是任何表达式,包括另一个逗号运算符。感谢您的澄清。
      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多