1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【看完必会系列】*p++ *(p++) (*p)++ *++p ++*p的区别

【看完必会系列】*p++ *(p++) (*p)++ *++p ++*p的区别

时间:2023-02-21 01:56:20

相关推荐

【看完必会系列】*p++ *(p++) (*p)++ *++p ++*p的区别

整片文章分为三个部分,分别是:

对于理解所提问题必须清楚的3个关键点;对3个关键点的理解;对于所提问题的案例解释。

1、对于理解所提问题必须清楚的3个关键点:

解决题目所提的问题之前,必须要明确以下几点,它们是用来区分上述几个例子的关键:

前置++(即++p),后置++(即p++),*,()等4个运算符优先级优先级相同情况下的结合性前置++和后置++的运算结果

其中,第三点又是这三个关键点中最关键的,特别在帮助大家理解含有前置++和后置++的复杂表达式的时候。

2、对3个关键点的理解:

1、优先级:

()> 后置++ > 前置++和*

(网上有很多文章把前置++和后置++优先级混为一谈,这是不准确的哦)

2、结合性:

结合性的讨论是建立在同一优先级的,也就是说,只有在优先级相同的情况下,我们才讨论结合性,它决定了运算符的匹配方式。

举例:

赋值运算符+=和-=处于同一优先级,结合方向是自右向左,那么7+=3-=2;运算顺序就是先算3-=2,结果为1,然后再算7+=1,结果为8。

3、++p的运算结果是什么?p++的运算结果又是什么?

++p:先对p做一次自增,再使用p的值;

p++:先使用p的值,再对p做一次自增。

(很多朋友在这里是比较困惑的,对于++p或者p++这样的表达式,它们的结果到底是什么?比如p++,我们刚说了先使用p的值,又说了对p再做一次自增,那么对于表达式来说到底用哪一次的值呢?通过刚才的解释,我们只需要记住:在基于对这两个表达式的意思已经理解的情况下,表达式的整个结果是对p“使用”时的值,注意上方红字部分,表示此时的p值即为表达式结果。在这里,我们一定要区分表达式的结果p的结果,他们是不一样的。)

举例:

p=3;

++p:先对p做一次自增(p为3+1=4),再使用p的值(p==4)。表达式的值为4。

p++:先使用p的值(p为3),再对p做一次自增(p为3+1,即4)。表达式的值为3。

3、对于所提问题的案例解释:

如果大家对于上述三点已经比较清楚了,那么我们就可以开始接下来的分析了:

为了便于理解,我们有如下假设:

p指向地址为0x00的内存,里面存了整型2,0x04地址里存了整型3。

*p++:

先分析优先级:后置++优先级高于*,所以先计算p++。(在这里给大家介绍一种分析方法,此时我们可以把p++看作*p++的一个子表达式,那么原表达式可以表示为*(p++),如果我们得出了p++这个表达式的结果为x,那么原表达式又可以表示为*x。通过子表达式这样的方式,是不是就会清晰了很多呢?)p++根据之前的介绍,先使用p的值,再自增1,其结果为使用时的值,即0x00这个地址,即p++整个表达式的值为0x00。所以*(p++)即为*(0x00),对0x00这个地址解引用拿到内存中存取的值为2;

*(p++):

这个例子因为括号的原因,先计算括号内表达式,后续同上。

(*p)++:

先分析优先级,右括号,先计算括号内,即先计算(*p)得到x,再计算x++。*p对p指向的地址解引用拿到内存中存放的2,即x的值为2,2++得到3,最终整个表达式结果为3;

*++p:

先讨论优先级,*和前置++优先级一样,则讨论结合性,两者结合性均为从右向左,所以++p先计算得到x,再计算*x。++p是对p自身做自增,地址+1,得到0x04的地址,即x的值为0x04,再*x解引用,拿到0x04地址中存放的内容,即3。最终整个表达式的值为3;

++*p:

先讨论优先级,*和前置++优先级一样,则讨论结合性,两者结合性均为从右向左,所以先计算*p得到x,再计算++x。*p对p指向的地址解引用,得到存放的2,再计算++2,得到整个表达式的值为3。

上述解释中,有一个很重要的技巧就是把一个较复杂的表达式,拆分为若干个子表达式,这样通过每一个子表达式计算的结果来计算整个表达式就会简单、清晰很多。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。