在C++ 中自增和自减操作符为对象加1或者减1提供了很多的方便,但是他们有前置和后置两种形式,以及与其它操作混合使用容易出现错误,所以在次写下自己的理解。
前置自增操作符,该操作使其操作数加1,操作的返回结果是修改后的数,
前置自减操作符,该操作使其操作数减1,操作的返回结果是修改后的数,
int i = 0,j = 0; j = ++i; cout<<"i="<<i<<endl;//1 cout<<"j="<<j<<endl;//1 j = i++; cout<<"i="<<i<<endl;//2 cout<<"j="<<j<<endl;//1
后置自增操作符,该操作使其操作数加1,操作的返回结果是修改前的数,
后置自减操作符,该操作使其操作数减1,操作的返回结果是修改前的数,
int i = 2,j = 2; j = --i; cout<<"i="<<i<<endl;//1 cout<<"j="<<j<<endl;//1 j = i--; cout<<"i="<<i<<endl;//0 cout<<"j="<<j<<endl;//1
建议:只有在必要时才使用后置操作符!原因是:使用前置操作符需要做的工作更少,只需要加1后返回加1后的结果就行,而后置操作符需要先保存操作数原来的值,以便返回未加1之前的操作数作为操作结果。
在表达式中组合使用解引用和自增操作
vector<int> ivec; int cnt = 10; while(cnt>0) ivec.push_back(cnt--);//10,9,8...1 vector<int>::iterator iter = ivec.begin(); while (iter !=ivec.end()) cout<<*iter++<<endl;//10,9,8...1
由于后自增操作符的优先级要高于解引用,所以*iter++相当于*(iter++).但是如果改成*++iter 则会出现错误,因为这样的话,ivec第一个元素没有输出,并企图对一个多余的元素进行解引用。
对于一个经典的例子:
*point1++ = *point2++;
等价于:
*point1 = *point2; ++point1; ++point2;