左值和右值赋值错误
lvalue and rvalue assignment error
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++ = y
,x++
只是计算表达式的结果,因此您无法为结果赋值。
另一种想法是这个表达式没有意义,因为变量 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++);
}
这也是未定义的行为。
- 错误:在为指针赋值时,void值没有被忽略
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- 奇怪的 G++ 错误,带有关于左值和赋值的简单代码
- 重载赋值运算符函数和复制构造函数中的错误
- 当我尝试构建此程序时,出现此错误:需要左键作为赋值的左操作数
- 错误:无法在赋值中将"双 ()(双)抛出 ()"转换为"双倍"
- 错误消息:使用复制构造函数和重载赋值运算符
- 为什么在取消引用的指向接口的指针上使用赋值运算符不是编译器错误
- 如何重载 const 对象的 [],以便值赋值不会导致编译错误
- C++的新增功能:创建 2D 数组并具有正确的赋值运算符:分割错误
- C++:构造函数中的向量赋值错误
- 使用赋值运算符复制两个类中的数组时出现编译器错误
- 可以错误地使用赋值运算符而不是比较运算符的地方,= Vs ==
- 唯一指针中的赋值运算符错误
- 不断增加的指针数组 错误:赋值中的类型不兼容
- C++赋值构造函数瓦尔格林德错误
- { } 构造函数实现中的赋值运算符 => 错误
- 使用宏进行赋值和错误检查
- 两个向量赋值错误
- 错误:在 GEANY 中将"int"赋值为"char [1]"时类型不兼容