C++ 左值和右值赋值错误 intx=3; int y=5; x++=y; 库特
根据我的理解,上述代码理论上应该将y的值复制到x中,然后在复制完成后最终增加x的值C++ 左值和右值赋值错误 intx=3; int y=5; x++=y; 库特,c++,assignment-operator,post-increment,C++,Assignment Operator,Post Increment,根据我的理解,上述代码理论上应该将y的值复制到x中,然后在复制完成后最终增加x的值 x++计算为r值(常数)。赋值运算符=需要一个l值(变量)作为其左操作数 int x = 3; int y = 5; x++ = y; cout << x << endl; 不能将常数指定给常数 X++= y不是C或C++中的有效语句。 代码> X++不能用作左操作数,因为它返回值,而不是地址。< /P> x++ = y ==> (3 + 1) = 5 ==> 4 = 5
x++
计算为r值(常数)。赋值运算符=
需要一个l值(变量)作为其左操作数
int x = 3;
int y = 5;
x++ = y;
cout << x << endl;
不能将常数指定给常数<代码> X++= y不是C或C++中的有效语句。 <代码>代码> X++<代码>不能用作左操作数,因为它返回值,而不是地址。< /P>
x++ = y ==> (3 + 1) = 5 ==> 4 = 5
现在
x+1=y
将抛出levaluerequired
,这意味着=
的左侧应该是一个变量,而不是一个常量x++
将导致一个临时对象在增量之前具有x
值。并且您不能指定临时对象
澄清的例子:
x++ ==> x=x+1
x++ = y ==> (x+1)=y
在这方面:
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
x++是r值,不能赋值,可以重写如下:3=5;这是没有意义的,您不能将5指定给3。后递增运算符的结果是一个临时对象,它在递增之前具有值。不能指定临时对象。所以这句话是无效的
x++ = y;
你可以用下面的方法重写它
x++ = y;
上面的语句是正确的。在表达式中:
x++=y
,x++
只是计算表达式的结果,因此不能为结果赋值
另一种想法是,这个表达式没有意义,因为变量
x
将用y
的值更新x++
的结果是x
的值,而不是对象x
。表达式是一个prvalue,这意味着您不能分配给它(您需要一个左值)
后缀++表达式的值是其操作数的值。[注:获得的值是原始值的副本-结束注释]。。。结果是一个pr值
要实现您的目标,您需要执行以下操作:
( x += 1 ) = y;
在C++11中,使用新的排序规则,您还可以执行以下操作:
x = y;
x++;
这在C++03中是未定义的行为,因为对
x
的两次修改之间没有序列点。核心问题是:
根据我的理解,上述代码理论上应该复制过来
将y的值转换为x,然后最后在
复印完毕。所以它会打印出“6”
事实上,增量的顺序尚未定义。与中一样,除了必须在某些特定时间之前发生之外,x
何时递增完全没有定义。在此未定义值期间读取或写入x
属于未定义行为。这就是为什么x++
不会返回x
(一个可以写入的左值),而是一个不能写入的右值的原因——因为在它保证递增之前,x
没有任何用处(可能除了获取地址)
您仍然可以通过引用x
两次来打破此规则-例如,考虑:
(x = y)++;
这也是未定义的行为。只需写x=y;x++;问题的标题与你的问题有什么关系?你认为什么是更合适的标题?每当我试图想出一个聪明的、描述性的标题堆栈溢出时,我都会对我大喊大叫:没有C/C++这样的东西。这些是不同的语言。操作的RVals/LValk规则在C和C++之间有细微的差别。你使用<代码> cOUT/CODEC>等似乎表明你在C++中编程,删除C标签。@ AyBayBay,Maroun Maroun现在已经给出了一个。你的问题跟指针有什么关系?看不到任何指针。@AyBayBay,因为当您执行
++x
时,第一个x
将递增。。然后它得到一些价值。。然后,你用y
@AyBayBay的值覆盖这个值:++x=y
增加x
的值,然后用y
@AyBayBay的值重写它,把它扔掉:这不是数学,因为这一方不平等x=y
表示y
的值分配给x
,而不是x
分配给y
。赋值运算符中的边并不重要。同样的原理也适用于你的问题,即为什么x=y++
和x++=y
中没有对称性。post增量确实在等待,但最终它返回的是一个值而不是一个地址,因此x=(5+1)
有意义,而(3+1)=5
没有。在我看来,这个答案是错误的。(8票赞成!)@DeadMG我认为这个答案意味着它等价于x=x+1=y
,因此通过关联性等价于x=(x+1=y)
。当然,x+1
给出的是一个右值这一事实也是一个问题,但解释不是真的。这是错误的,因为1不是l值编译器所抱怨的,它抱怨的是在增加x
处的值之前返回的临时值。此临时变量在递增之前的值为x
,而不是1
。表达式也不是这样工作的x++
是子表达式,因此它几乎等同于(x=x+1)=y
@marounnaroun:No,就像写(x=x+1)=y一样代码>是错误的x++=y
尝试将y
分配给临时值x
,而不是x+1
。请仔细阅读我的第一条评论。@legends2k你完全正确。谢谢。<代码> ++x/COD>是C++中的L值,问题是加标签C++,修复这个。不是<代码>(x+=1)=y;<代码>修改x
两次,没有中间的序列点?@legends2k我同意你的看法。但问题是程序没有定义bahaviour,因为操作x=x+1和x=y不是s
void f(int, int);
int main() {
int x = 0;
f(x++, x++);
}