【问题标题】:Does operator ',' always returns the second argument?运算符 ',' 是否总是返回第二个参数?
【发布时间】:2016-10-28 14:28:34
【问题描述】:

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

【问题讨论】:

  • "不要问两次" 为什么不呢?不同的问题应该放在不同的问题帖子中。
  • @MikeCAT,只是聚合查询的合理习惯
  • 这两个问题不相关,应该分开提问和回答。
  • btw 执行顺序不是“未定义的行为”,但它只是未定义的,即。在某些情况下,您不能依赖操作顺序。但是,您的示例的唯一问题是可读性

标签: c++ operators operator-precedence


【解决方案1】:

C++ 标准 5.18 说

一对用逗号分隔的表达式从左到右计算; 左边的表达式是一个废弃的值表达式(第 5 条).86 每个 与左表达式相关的值计算和副作用 在每个值计算和相关的副作用之前排序 用正确的表达。结果的类型和值是 右操作数的类型和值;结果是相同的值 类别作为它的右操作数,如果它的右操作数是一个位域 是一个左值和一个位域。如果右操作数的值是 临时的(12.2),结果就是临时的。

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

但是,you can overload comma operator,在这种情况下,它可以返回任何你想要的东西。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 2011-07-31
      • 2011-10-24
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多