*p++、(*p)++、*++p、++*p的区别

发布时间 2024-01-04 17:17:00作者: ⭐⭐-fighting⭐⭐
*p++、(*p)++、*++p、++*p的区别

三个关键点

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

三个关键点的理解

优先级:

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

结合性

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

举例:

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

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

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

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

案例解释

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

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

image

  • *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。

    具体数值的++是直接加。