operator','总是返回第二个参数吗?

时间:2016-06-26 14:09:15

标签: c++ operators operator-precedence

In GCC

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

它输出'正确',它总是如此吗?

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

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 '我看不到它的警告,以及预期的结果,所以我猜有没有这里有问题。

2 个答案:

答案 0 :(得分:2)

C ++标准5.18说

  

用逗号分隔的一对表达式从左到右进行评估;   左表达式是一个abandonedvalue表达式(第5条).86 Every   值计算和与左表达式相关的副作用   在每个值计算和副作用相关之前进行排序   用正确的表达方式。结果的类型和值是   右操作数的类型和值;结果具有相同的值   category作为右操作数,如果是右操作数则是一个位字段   是一个glvalue和一个位域。如果右操作数的值是a   临时(12.2),结果是暂时的。

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

然而,you can overload comma operator,在这种情况下,它可以返回您想要的任何内容。

答案 1 :(得分:0)

不完全。对于诸如int double之类的基类型,它是正确的。 对于我们的课程,我们可以覆盖,运算符并决定运算符返回的内容。 在boost lib中有一个很好的例子,该函数是关于向量的插入。