C++代码片段的无动于衷的行为

Indifferent behavior of C++ code snippet

本文关键字:无动于衷 C++ 片段 代码      更新时间:2023-10-16

请考虑以下代码片段

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 值。该值是临时值(即右值),不能分配给它。

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

更多关于维基百科上的左值和右值。

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

当然,所有这些都是为了内置++运算符。 如果你重载,这取决于重载的签名(但是正确设计的重载++的行为类似于内置的)。

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