读书人

是书错了 还是小弟我理解错了

发布时间: 2012-04-10 21:03:56 作者: rapoo

是书错了 还是我理解错了?
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)++


[解决办法]
对这种东西不要太纠结,因为实际中这种容易误导人的用法是不能用的!!

读书人网 >C++

热点推荐