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

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

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

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

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

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

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


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。

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

 

  • 39
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9号信箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值