是书错了 还是我理解错了?
C++primer第四版 5.5章
vector<int>::iterator iter = ivec.begin();
// prints 10 9 8 ... 1
while (iter != ivec.end())
cout << *iter++ << endl;
由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于 *(iter++)。子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达式的结果。因此,解引用操作 * 的操作数是 iter 未加 1 前的副本。
这种用法的根据在于后自增操作返回其操作数原值(没有加 1)的副本。如果返回的是加 1 后的值,则解引用该值将导致错误的结果:ivec 的第一个元素没有输出,并企图对一个多余的元素进行解引用。
5.10章
*iter++;其中,++ 的优先级高于*操作符,这就意味着 iter++ 先结合。而操作符 * 的操作数是 iter 做了自增操作后的结果。如果我们希望对 iter 所指向的值做自增操作,则必须使用圆括号强制实现我们的目的
这几句到底该怎么理解呢
[解决办法]
没有错,++是先结合,但计算的结果还是一样。因为它是后置的,完成++运算后把值填回iter中,但给表达式的返回值还是没有增量之前的。
“如果我们希望对 iter 所指向的值做自增操作,则必须使用圆括号强制实现我们的目的”意思是你想要把*iter里面的内容增量,而不是把iter自己增量的话,那就得写成这样:(*iter)++。
[解决办法]
你对*iter++的理解没有错,
但是你对书的理解错了>
*iter++;其中,++ 的优先级高于*操作符,这就意味着 iter++ 先结合。而操作符 * 的操作数是 iter 做了自增操作后的结果。如果我们希望对 iter 所指向的值做自增操作,则必须使用圆括号强制实现我们的目的
它的意思是:
*iter++
==>>
(*iter)++
[解决办法]
对这种东西不要太纠结,因为实际中这种容易误导人的用法是不能用的!!