请考虑以下代码段
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
。
我无法找到这种漠不关心的行为的原因。如果有人解释这一点,我将不胜感激。
答案 0 :(得分:4)
表达式i++
在递增操作之前计算为i
的值。该值是临时值(即 rvalue ),您无法分配给它。
++i
有效,因为该表达式在递增后计算为i
,并且i
可以分配给它(它是左值)。
答案 1 :(得分:0)
根据C ++标准,前缀++
是一个左值(其中
不同于C),后修复没有。更一般地说,C ++需要
任何改变左值的观点
参数,并将该参数的值作为其值,
结果是左值。所以++ i
是一个左值(因为
结果值是i
)的新值,但i ++
不是
(因为结果值不是新值,而是旧值。)
当然,对于内置的++
运算符,所有这一切。如果你
超载,它取决于你的重载的签名(但是
正确设计的重载++
将表现得像
内置的)。
当然,你的(++ i) = a;
和(i ++) = a;
都没有
例子是合法的;都使用未初始化的值
变量(i
),这是未定义的行为,并且都修改i
两次没有插入序列点。