左值和右值赋值错误

lvalue and rvalue assignment error

本文关键字:错误 赋值      更新时间:2023-10-16
int x = 3;
int y = 5;
x++ = y;
cout << x << endl;

为什么上面的代码给我一个错误,我得到的具体错误是

需要左键作为赋值的左操作数。

我正在尝试审查我的 C 和C++。根据我的理解,上面的代码理论上应该将y的值复制到x,然后在复制完成后最终增加x的值。所以它会打印出"6"。

x++ ==> x=x+1
x++ = y ==> (x+1)=y

现在x+1=y会抛出lvalue required这意味着=的左侧应该是一个变量而不是一个常量

postincrement 运算符的结果是一个临时对象,该对象在递增之前具有该值。您不能分配临时对象。所以这种说法是无效的。

x++ = y;

您可以通过以下方式重写它

( x += 1 ) = y;

上述陈述是正确的。

x++不能用作左操作数,因为它返回值,而不是地址。

在这一行中:

x++ = y;

x++ 是 r 值,你不能赋值,你可以重写它如下:3 = 5;这没有意义,你不能将 5 赋值到 3。

在表达式中:x++ = yx++ 只是计算表达式的结果,因此您无法为结果赋值。

另一种想法是这个表达式没有意义,因为变量 x 将使用 y 的值进行更新。

x++的结果

x的值,但不是对象x。表达式是一个 prvalue,这意味着你不能分配给它(你需要一个左值)。

后缀 ++ 表达式的值是其操作数的值。[ 注意:获得的值是原始值的副本 — 尾注 ] ...结果是一个 prvalue。

要实现您想要的,您需要执行以下操作:

x = y;
x++;

在 C++11 中,使用新的排序规则,您还可以执行以下操作:

(x = y)++;

这在 C++03 中将是未定义的行为,因为x的两次修改之间没有序列点。

根据我的理解,上面的代码理论上应该将 y 的值复制到 x,然后在复制完成后最终递增 x 的值。

x++计算结果为 r 值(常量)。赋值运算符 = 需要一个 l 值(变量)作为其左操作数。

x++ = y ==> (3 + 1) = 5 ==> 4 = 5  

不能将常量赋给常量。 x++ = y 在 C 或 C++ 中都不是有效的语句。

x++生成一个临时对象,该对象在增量之前具有x值。并且不能分配临时对象。

澄清示例:

int a=1; 
a=5; // Lvalue = Rvalue, Ok 
a=a; // Lvalue = Lvalue, Ok 
5=a; // Rvalue = Lvalue Comp. error
5=5; // Rvalue = Rvalue Comp. error 

核心问题是:

根据我的理解,上面的代码理论上应该复制 将 y 的值转换为 x,然后最后在 复制已完成。所以它会打印出"6"。

事实上,增量的顺序是不确定的。例如,对于何时递增x完全没有定义,除了它必须在某个特定时间之前发生。在这段未定义值的时间段内读取或写入x是未定义的行为。这就是为什么x++不返回x(你可以写入的左值),而是返回一个你不能写入的右值 - 因为在保证它被增加之前,你根本无法用x做任何有用的事情(除了地址,也许)。

您仍然可以通过引用两次x来违反此规则 - 例如,考虑:

void f(int, int);
int main() {
    int x = 0;
    f(x++, x++);
}

这也是未定义的行为。