目录
*p++、(*p)++、*(p++)、*++p、++*p的区别
*p++、(*p)++、*(p++)、*++p、++*p的区别
一、三个关键点
1.前置++ (即++p),后置++ (即p++) ,*0等4个运算符优先级
2. 优先级相同情况下的结合性
3.前置++和后置++的运算结果
二、三个关键点的理解
优先级:
0>后置++ >前置++和*
3、结合性 三
结合性的过论是建立在同一优先级的,也就是说,只有在优先级相同的情况下,我们才讨论结合性,*它决定了运算符的匹配方式*
举例:
赋值运算符+=和-=处于同一优先级,结合方向是 自右向左,那么7+=3-=2,运算顺序就是先算3-=2,结果为1,然后再算7+=1,结果为8
+ +p的运算结果是什么? p+ +的运算结果又是什么?
++p: 先对p做一次自增,再使用p的值,
p++: 先使用p的值,再对p做一次自增.
案例解释
为了便于理解,我们有如下假设:
p指向地址为0x00的内存,里面存了整型2,0x04地址里存了整型3.
1)*p++
对0x00这个地址解引用拿到内存中存取的值为2.
2)*(p)++
先分析优先级,有括号,先计算括号内,即先计算(p)得到,再计算X++。 p对p指向的地址解引用拿到内存中存放的2,即x的值为2,2++得到3,最终整个表达式结果为3;
3)*(p++)
*(p++),是先对指针P进行++运算,然后再取取值,由于*和++的运算优先级一样,且是右结合。故*p++相当于*(p++),p先与++结合,然后p++整体再与*结合。
但是,因为++后置的时候,本身含义就是先运算后增加1(运算指的是p++作为一个整体与前面的*进行运算;增加1指的是p+1),所以实际上*p++符号整体对外表现的值是*p的值,运算完成后p再加1。
4)*++p
先讨论优先级,和前置++优先级一样,则讨论结合性,两者结合性均为从右向左,所以++p先计算得到x,再计算X。++p是对p自身做自增,地址+1,得到0x04的地址,即x的值为0x04,再x解引用,拿到0x04地址中存放的内容,即3。最终整个表达式的值
为3;
5)++*p:
先讨论优先级,和前置++优先级一样,则讨论结合性,两者结合性均为从右向左,所以先计算p得到x,再计算++x。*p对p指向的地址解引用,得到存放的2,再计算++2,得到整个表达式的值为3。