为什么该代码由于错误而无法编译:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << ++(i++) << " " << i << endl;
return 0;
}
虽然该代码确实可以编译:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << (++i)++ << " " << i << endl;
return 0;
}
我不明白。从我的角度来看,编译第一个 block 是非常合理的。表达式++(i++) 只是表示取 i,递增它并输出,然后再次递增它。
我不是在询问 int 溢出中的未定义行为。在写这个问题时我根本不知道 r 和 l 值,我也不在乎为什么++i 被认为是左值,但 i++ 不是。
最佳答案
这是因为后自增和前自增运算符返回的值类型不同。后增量的结果是所谓的“右值”,这意味着它不能被修改。但是预增量需要一个可修改的值来增加它!
另一方面,预增量的结果是一个左值,这意味着它可以被后增量安全地修改。
上述规则的原因是后增量需要返回应用增量之前对象的值。顺便说一句,这就是为什么在一般情况下,当用于非内置对象时,后增量被认为比前增量更昂贵。
关于c++ - 导致错误的后缀和前缀增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44977326/