C++ 左值和右值赋值错误 intx=3; int y=5; x++=y; 库特

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

根据我的理解,上述代码理论上应该将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+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++);
}