*p++、(*p)++、*++p、++*p的区别
三个关键点
- 前置++(即++p),后置++(即p++),*,()等4个运算符优先级
- 优先级相同情况下的结合性
- 前置++和后置++的运算结果
三个关键点的理解
优先级:#
() > 后置++ > 前置++和*
结合性#
结合性的讨论是建立在同一优先级的,也就是说,只有在优先级相同的情况下,我们才讨论结合性,*它决定了运算符的匹配方式*。
举例:
赋值运算符+=和-=处于同一优先级,结合方向是自右向左,那么7+=3-=2;运算顺序就是先算3-=2,结果为1,然后再算7+=1,结果为8。
++p的运算结果是什么?p++的运算结果又是什么?#
++p:先对p做一次自增,再使用p的值;
p++:先使用p的值,再对p做一次自增。
案例解释
为了便于理解,我们有如下假设:
p指向地址为0x00的内存,里面存了整型2,0x04地址里存了整型3。
-
*p++:
对0x00这个地址解引用拿到内存中存取的值为2; -
(*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。
具体数值的++是直接加。
作者:keep--fighting
出处:https://www.cnblogs.com/keep--fighting/p/17945727
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!