1

考虑以下代码片段

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

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

4

2 回答 2

4

表达式i++计算为i增量操作之前的值。该值是一个临时值(它是一个rvalue),您不能分配给它。

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

更多关于 Wikipedia 上的左值和右值

于 2013-09-10T12:19:17.983 回答
0

根据 C++ 标准,prefix++是一个左值(不同于 C),post-fix no。更一般地说,C++ 的观点是,任何改变左值参数并以该参数的值作为其值的东西都会产生左值。左值也是如此++ i(因为结果值是 的新值i),但i ++不是(因为结果值不是新值,而是旧值)。

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

当然,在您的示例中(++ i) = a;也不(i ++) = a;合法;两者都使用未初始化变量 ( i) 的值,这是未定义的行为,并且都修改i 了两次而没有中间的序列点。

于 2013-09-10T13:07:33.713 回答