C ++代码片段的无关行为

时间:2013-09-10 12:10:38

标签: c++ compiler-errors

请考虑以下代码段

int a,i;  
a = 5;  
(i++) = a;  
(++i) = a;  
cout<<i<<endl;

(++i) = a正在正确编译并输出5作为输出 但(i++) = a正在编译错误error: lvalue required as left operand of assignment

我无法找到这种漠不关心的行为的原因。如果有人解释这一点,我将不胜感激。

2 个答案:

答案 0 :(得分:4)

表达式i++在递增操作之前计算为i的值。该值是临时值(即 rvalue ),您无法分配给它。

++i有效,因为该表达式在递增后计算为i,并且i可以分配给它(它是左值)。

More on lvalues and rvalues on Wikipedia

答案 1 :(得分:0)

根据C ++标准,前缀++是一个左值(其中 不同于C),后修复没有。更一般地说,C ++需要 任何改变左值的观点 参数,并将该参数的值作为其值, 结果是左值。所以++ i是一个左值(因为 结果值是i)的新值,但i ++不是 (因为结果值不是新值,而是旧值。)

当然,对于内置的++运算符,所有这一切。如果你 超载,它取决于你的重载的签名(但是 正确设计的重载++将表现得像 内置的)。

当然,你的(++ i) = a;(i ++) = a;都没有 例子是合法的;都使用未初始化的值 变量(i),这是未定义的行为,并且都修改i 两次没有插入序列点。