前置版本(++i):首先将运算对象加1,然后将改变后的对象作为求值结果;
后置版本(i++):也会将运算对象加1,但是求值结果是运算对象改变之前那个值的副本;
int i = 0,j;
j = ++i; //j = 1,i = 1;前置版本得到递增之后的值; 即 i = i + 1, j = 1;
int i = 0,j;
j = i++; //j = 0,i = 1;后置版本得到递增之前的值;即 j = i, i = i + 1;
两种运算符都必须作用于左值运算对象(当对象被用作左值时,用的是对象的在内存中的位置):
前置版本将对象本身作为左值返回;
后置版本将对象原始值的副本作为右值返回(当对象被用作右值,用的是对象的值(内容))。
建议:除非必须,否则不用递 增减运算符的后置版本;
使用后置版本的一个例子:
// 混用解引用和递增运算符
vector<int> v;
int num;
while(cin>>num)
{
v.push_back(num);
}
auto p = v.begin();
while(p != v.end() && *p >= 0)
{
cout<<*p++<<endl; //*p++ = *(p++)
//cout<<*p<<endl;
//++p;
} //输出当前值并将p向前移动一个元素
//如果改成*++p,程序无法输出第一个元素,且如果序列中没有负值,程序将可能试图解引用一个根本不存在的元素
//我自己试的时候程序debug的时候会报错。