运算符 ',' 是否总是返回第二个参数?

Does operator ',' always returns the second argument?

本文关键字:第二个 参数 返回 是否 运算符      更新时间:2023-10-16

在GCC

#include <iostream>
int main() {
  if(1 == 2, true) {
    std::cout << "right" << std::endl;
  } else std::cout << "left" << std::endl;
  return 0;
}

它输出'right',它总是这样吗?


编译器可以优化出左操作数,因为它没有使用?

warning: left operand of comma operator has no effect [-Wunused-value]
   if(1 == 2, true) {
      ~~^~~~

我有一些像这样的代码:

if(doSomethingHereWhichAlwaysReturnsTrue,
     doSomeOtherHereAndDependOnTheResultExecuteBodyOrNot) {
  ..body.. - execute if 'doSomeOther' returns true
}

通过这段代码是调试的,我想知道我可以在发布中使用这样的结构。我猜没有


不问两次,我有时也使用分配链,如:

int i, j, k, l;
i = j = k = l = 0;

安全吗?

我曾经听说执行顺序是未定义的,所以这是一个未定义的行为。作为UB,它可以被编译器清楚地优化出来,但使用'-O3 -Wall -pedantic',我看到没有警告,和预期的结果,所以我猜这里有没有问题。

c++标准5.18规定

用逗号分隔的一对表达式从左到右求值;左边的表达式是一个discardedvalue表达式(第5条)每一个与左表达式相关的值计算和副作用在每个值计算和副作用关联之前进行排序用正确的表达。结果的类型和值为右操作数的类型和值;结果是相同的值类别作为其右操作数,如果其为右操作数,则为位域是一个全局值和位域。如果右操作数的值为a临时的(12.2),结果是临时的。

所以,是的,根据标准,返回第二个操作数的值是预期的行为。

但是,您可以重载逗号操作符,在这种情况下,它可以返回您想要的任何内容。

不完全是。对于int double等基本类型,它是正确的。而对于类,可以覆盖,操作符并决定操作符返回什么。在boost库中有一个很好的例子,该函数是关于插入向量的。