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 ++不是.
这是因为后增量和前增量运算符返回不同类型的值.后增量的结果是所谓的'rvalue',意味着它不能被修改.但预增量需要一个可修改的值来增加它!
另一方面,预增量的结果是左值,这意味着它可以通过后增量安全地修改.
上述规则的原因是后增量需要返回对象的值,就像应用增量之前一样.顺便说一句,这就是为什么在一般情况下,后incrememts被视为非内置对象使用时比预增量更加昂贵.