考虑以下代码片段
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
。
我无法找到这种冷漠行为的原因。如果有人解释这一点,我将不胜感激。
考虑以下代码片段
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
。
我无法找到这种冷漠行为的原因。如果有人解释这一点,我将不胜感激。
表达式i++
计算为i
增量操作之前的值。该值是一个临时值(它是一个rvalue),您不能分配给它。
++i
之所以有效,是因为该表达式i
在递增后计算为,并且i
可以分配给(它是一个左值)。
根据 C++ 标准,prefix++
是一个左值(不同于 C),post-fix no。更一般地说,C++ 的观点是,任何改变左值参数并以该参数的值作为其值的东西都会产生左值。左值也是如此++ i
(因为结果值是 的新值i
),但i ++
不是(因为结果值不是新值,而是旧值)。
当然,所有这些都是针对内置++
运算符的。如果你重载,它取决于你的重载的签名(但一个正确设计的重载++
将表现得像内置的)。
当然,在您的示例中(++ i) = a;
也不(i ++) = a;
合法;两者都使用未初始化变量 ( i
) 的值,这是未定义的行为,并且都修改i
了两次而没有中间的序列点。