int x = 3;
int y = 5;
x++ = y;
cout << x << endl;
为什么上面的代码给我一个错误,我得到的具体错误是
左值作为赋值的左操作数。
我正在尝试检查我的C和C ++。根据我的理解,上面的代码理论上应该将y
的值复制到x
,然后在复制完成后最终增加x
的值。所以它会打印出“6”。
答案 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++ = y
,x++
只是表达式的结果,因此您无法为结果赋值。
另一种想法是,这个表达式没有任何意义,因为变量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++);
}
这也是未定义的行为。