【问题标题】:Assignment operator, identical statements赋值运算符,相同的语句
【发布时间】:2014-05-04 03:49:34
【问题描述】:

这是一个愚蠢的问题,但我很难过。以下两个 C++ 语句是否相同?

regWages = regPay + overTime;
regPay + overTime = regWages;

【问题讨论】:

  • 如有疑问,请始终尝试在当前标准编译器中进行编译。作为一个实验,我尝试了第二行(例如不期望太多)。编译器说,“表达式是不可赋值的。”这是来自基于 CLang++ 3.1 的 C++11 编译器。

标签: c++ variable-assignment assignment-operator


【解决方案1】:

没有。一个有效,另一个无效。 (也许。*)

您通常只能分配给 左值,从重言式上讲,您可以分配给它们。算术表达式的结果通常不是您可以分配的。

更简单地说:a = 1 + 2 可以,但1 + 2 = a 不行。你可以给a一个值,但是你不能给整数相加的结果一个值。

C++ 中的赋值是一种状态变化。它与“方程”的数学概念非常不同。 C++ 中的赋值更像是数学中的定义,但与数学不同的是,您可以将值重新分配给现有对象。

*) 运算符重载使情况有点复杂。

【讨论】:

    【解决方案2】:

    为了解决你的疑惑,你应该了解一个导入概念:Lvalues and Rvalues

    在你的代码中regWages = regPay + overTime;是对的,因为如果变量regWages是左值,它是一个非临时对象,你可以做=操作。

    regPay + overTime = regWages;是错误的,因为regPay + overTime的结果是Rvalues,只是一个临时变量,不能做=操作。

    【讨论】:

      【解决方案3】:

      这很有趣,但根据对象的类型定义,这两个运算符都可以有效。

      regWages = regPay + overTime;
      regPay + overTime = regWages;
      

      然而它们在语义上是不同的,赋值运算符不是对称的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-27
        • 2013-07-28
        • 2017-08-12
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2013-03-06
        相关资源
        最近更新 更多