Postfix和前缀增量导致错误

Yar*_*lav 2 c++ increment postfix-notation prefix-notation

为什么该代码由于错误而无法编译:

#include <iostream>

using namespace std;

int main()
{
    int i = 0; 
    cout << ++(i++) << " " << i << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然该代码确实编译:

#include <iostream>

using namespace std;

int main()
{
    int i = 0; 
    cout << (++i)++ << " " << i << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白这个.从我的观点来看,编译第一个块是非常合理的.表达式++(i ++)只是意味着取i,递增它并输出,然后再递增它.

我不是在询问int溢出中的未定义行为.在写这个问题时我根本不知道r和l值,我不在乎为什么++我被认为是l值,但i ++不是.

Ser*_*eyA 6

这是因为后增量和前增量运算符返回不同类型的值.后增量的结果是所谓的'rvalue',意味着它不能被修改.但预增量需要一个可修改的值来增加它!

另一方面,预增量的结果是左值,这意味着它可以通过后增量安全地修改.

上述规则的原因是后增量需要返回对象的值,就像应用增量之前一样.顺便说一句,这就是为什么在一般情况下,后incrememts被视为非内置对象使用时比预增量更加昂贵.