左值和右值赋值错误

时间:2013-12-31 09:40:58

标签: c++ assignment-operator post-increment

int x = 3;
int y = 5;
x++ = y;
cout << x << endl;

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

  

左值作为赋值的左操作数。

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

9 个答案:

答案 0 :(得分:6)

x++ ==> x=x+1

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

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

答案 1 :(得分:2)

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

x++ = y;

您可以通过以下方式重写

( x += 1 ) = y;

上述说法是正确的。

答案 2 :(得分:1)

  

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

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

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

您无法为常量指定常量。 x++ = y不是C或C ++中的有效语句。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

在这一行:

x++ = y;

x ++是r值,你无法分配它,你可以按如下方式重写它:3 = 5;没有意义,你不能分配5到3。

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

  

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

要实现您的目标,您需要:

x = y;
x++;

在C ++ 11中,使用新的排序规则,你也可以这样做:

(x = y)++;

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

答案 7 :(得分:0)

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 

答案 8 :(得分:0)

核心问题是:

  

根据我的理解,上面的代码理论上应该复制过来   y的值为x,然后最后增加x之后的值   副本已经完成。所以它会打印出“6”。

实际上,增量的顺序是 undefined 。同样,对x何时递增完全未定义,除非它必须在某些特定时间之前发生。在此未定义值期间读取或写入x是未定义的行为。这就是为什么x++不会返回x(你可以写入的左值)而是一个你无法写入的左值的原因 - 因为在x之前没有任何用处可用,直到它保证为止增加(除了拿地址,可能)。

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

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

这也是未定义的行为。