为什么推荐使用前置?
在复合表达式中,如果使用递增(递减)运算符的前置版本,会先将运算对象加1(减1),然后再对改变后的对象进行操作;而后置版本会先对该对象进行其他操作,再将其增1(减1)。
由此可见,相比后置版本,前置版本避免了不必要的工作,它把值加1(减1)后直接返回改变后的运算对象,而后置版本需要先将对象的原始值存储下来以便于返回这个未修改的内容,如果我们不需要用到修改前的值,那么后置版本的操作就是一种浪费。
对于整数和指针类型来说,编译器可能会对这种额外的工作进行一定的优化;但是对于相对复杂的迭代器类型,这种额外工作就消耗巨大了。所以建议大家养成使用前置版本的习惯,这样不仅不需要担心性能的问题,而且更重要的是写出来的代码会更符合编程的初衷。
什么时候使用后置?
如果我们想在一个复合表达式中既要把变量加1(减1)又要使用它原来的值,这时候就推荐使用后置版本,使我们的程序更简洁。
举个栗子,我们要输出vector容器中的正数直到遇到第一个负数为止:
auto it=v.begin();
while(it!=v.end() && *it>=0)
cout << *it++ << endl;
//以上的最后一句等价于:
cout << *it << endl;
++it;
语句“*it++”,这种写法很普遍,即先输出it指针的解引用,再将it指针移动一个位置,如果是先将指针位移,再返回解引用的值,就可能会出现操作空指针的错误,即试图解引用一个根本不存在的元素。
大多C++程序追求简洁、摒弃冗长,因此建议大家习惯这种简洁的写法,程序出错的可能性也会降低。