*iter++应该怎么理解?
C++Primer中文第四版第141页,写到了*iter++,返回的是iter自增前的解引用值。不太懂,求大神解答...
C++Primer中文第四版第141页,写到了*iter++,返回的是iter自增前的解引用值。不太懂,求大神解答
展开
2个回答
展开全部
在
int a;
int *pa=&a;
之后,*pa完全等价于a,那么*pa++也就是a++了.
追问
。。。很遗憾书上的意思是*iter++输出iter++前指向的值,也就是*iter。。。而且。。“之后,*pa完全等价于a,那么*pa++也就是a++了.”这句话我不太认同。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在表达式中出现++,++操作总是在表达式运算完成后才进行。
如:
void main()
{
int a[2]={10,20};
int *pa=a;
int x,y;
x=*pa++;//相当于x=*pa; pa++;两条语句。
//运算完成后x=a[0]=10,pa指向+1,指向a[1]
y=(*pa)++;//相当于y=(*pa);(*pa)++;两条语句。
//运算完成后y=a[1]=20,pa指向不变,但指向的值+1,即a[1]=21
}
楼主参考。
如:
void main()
{
int a[2]={10,20};
int *pa=a;
int x,y;
x=*pa++;//相当于x=*pa; pa++;两条语句。
//运算完成后x=a[0]=10,pa指向+1,指向a[1]
y=(*pa)++;//相当于y=(*pa);(*pa)++;两条语句。
//运算完成后y=a[1]=20,pa指向不变,但指向的值+1,即a[1]=21
}
楼主参考。
追问
恩你说的有一定道理,书上原话是“子表达式iter++使iter加1,然后返回iter原值的副本作为该表达式的结果。因此,解引用操作*的操作数是iter未加1前的副本”,我想知道这副本是怎么回事?另外,它前面还提到了因为自增操作优先于解引用,所以*iter++等效于*(iter++),这样的话不是应该先自增再解引用吗?
追答
第一个问题:
因为实质是两步操作,第二步操作要修改++的操作数(或表达式),所以此操作数(或表达式)在++操作之前的值被称为副本,只是一个称呼而已,不同的编译器实现的方式也许不一样,但实质都等效于我说的两步操作。
第二个问题:
自增操作优先于解引用(++操作优先于*),这里应该理解为是一种结合的顺序:
在*iter++中,对于变量iter来说,先结合++来运算,还是先结合*来运算呢?如果先结合++,那结果就相当于*(iter++),如果先结合*,就相当于(*iter)++,前者++的操作对象是iter,后者++的操作对象是*iter。
由于c++定义的优先顺序是++先于*,即先结合++,也即*iter++等效于*(iter++)。
不知道这么说你能不能理解。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询