【问题标题】:Equal sign/Assignment Operator inside statement语句中的等号/赋值运算符
【发布时间】:2017-03-27 13:45:52
【问题描述】:

前几天我在浏览github,发现了这段C++代码。

order[i]= order[i]+order[r]-(order[r]=order[i]);

为什么一行代码中有两个等号?我以前从未见过。

【问题讨论】:

  • 这意味着你不应该这样做。从你的记忆中删除这行代码,并假装你从未见过它。这并不是一个很好的编程实践的典型例子。
  • @desertSniper87 有两个等号表示程序的未定义行为。:)
  • 另外注意,这段代码只是交换了 order[i] 和 order[r]。

标签: c++ c


【解决方案1】:

赋值运算符=returns an LVALUE, meaning a value can be further assigned to it

此外,这通常是糟糕的编码,因为它很可怕。作者最好在多行上进行单独的分配,因为它更容易阅读,在实现时不易出错(作为可读性的扩展),优化器可能会在任何一种情况下生成类似的代码,等等。此外,这种的代码通常会导致关于 SO 的常见重复问题:sequence points, and why this code is horrible.

编辑And as others have pointed out, it invokes UB. Axe it.

【讨论】:

  • 所以我应该将代码折射成这样: temp = order[r];订单[r] = 订单[i]; order[i]= order[i]+temp-order[r];
  • 它不仅丑陋,而且还被低估了。所以是的,重构它。
  • @desertSniper87 是的,类似的。现在可以更轻松地查看代码的意图
【解决方案2】:

在 C 和 C++ 中,赋值 operator 只是一个与其他运算符一样的运算符。它返回赋值左侧的对象。

所以末尾的括号将order[i] 复制到order[r],然后使用order[r] 及其新值。

非常重要的说明:这个表达式的结果是不确定的:在其他一些语言中是not guaranteed that the operands of the operator are evaluated from left to rightlke。如果第二项在第三项赋值之前或之后使用order[r],则它取决于编译器。所以有2个可能的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-04
    • 2013-07-28
    • 1970-01-01
    • 2012-11-02
    • 2013-07-15
    • 1970-01-01
    • 2016-06-08
    • 2013-03-06
    相关资源
    最近更新 更多