原来一直以为前增就是先执行加1操作,然后再执行其它的操作,后增是先执行其它操作,然后再执行加1操作。
事实上,后增只是保存了一个原值的副本,然后自身加1,而前增没有保存副本的这个操作。
C++ Primer 上的代码解释:
vector<int>::iterator iter = ivec.begin();
// prints 10 9 8 ... 1
while (iter != ivec.end())
cout << *iter++ << endl; // iterator postfix increment
由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于 *(iter++)。子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达式的结果。因此,解引用操作 * 的操作数是 iter 未加 1 前的副本。
这种用法的根据在于后自增操作返回其操作数原值(没有加 1)的副本。如果返回的是加 1 后的值,则解引用该值将导致错误的结果:ivec 的第一个元素没有输出,并企图对一个多余的元素进行解引用。
惭愧惭愧。。。。。。。。