一:运算优先级
在了解区别和用法前,我们首先要知道"*","++"两种运算符的优先级(这里的”*“为取址运算符)
|
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
|
1 |
[] |
数组下标 |
数组名[常量表达式] |
从左到右 |
-- |
|
() |
圆括号 |
(表达式)/函数名(形参表) |
-- | ||
|
. |
成员选择(对象) |
对象.成员名 |
-- | ||
|
-> |
成员选择(指针) |
对象指针->成员名 |
-- | ||
|
2 |
- |
负号运算符 |
-表达式 |
从右到左 |
单目运算符 |
|
~ |
按位取反运算符 |
~表达式 | |||
|
++ |
自增运算符 |
++变量名/变量名++ | |||
|
-- |
自减运算符 |
--变量名/变量名-- | |||
|
* |
取值运算符 |
*指针变量 | |||
|
& |
取地址运算符 |
&变量名 | |||
|
! |
逻辑非运算符 |
!表达式 | |||
|
(类型) |
强制类型转换 |
(数据类型)表达式 |
-- | ||
|
sizeof |
长度运算符 |
sizeof(表达式) |
-- | ||
|
3 | / |
除 |
表达式/表达式 |
从左到右 |
双目运算符 |
|
* |
乘 |
表达式*表达式 | |||
|
% |
余数(取模) |
整型表达式%整型表达式 | |||
|
4 |
+ |
加 |
表达式+表达式 |
从左到右 |
双目运算符 |
|
- |
减 |
表达式-表达式 | |||
|
5 |
<< |
左移 |
变量<<表达式 |
从左到右 |
双目运算符 |
|
>> |
右移 |
变量>>表达式 | |||
|
6 |
> |
大于 |
表达式>表达式 |
从左到右 |
双目运算符 |
|
>= |
大于等于 |
表达式>=表达式 | |||
|
< |
小于 |
表达式<表达式 | |||
|
<= |
小于等于 |
表达式<=表达式 | |||
|
7 |
== |
等于 |
表达式==表达式 |
从左到右 |
双目运算符 |
|
!= |
不等于 |
表达式!= 表达式 | |||
|
8 |
& |
按位与 |
表达式&表达式 |
从左到右 |
双目运算符 |
|
9 |
^ |
按位异或 |
表达式^表达式 |
从左到右 |
双目运算符 |
|
10 |
| |
按位或 |
表达式|表达式 |
从左到右 |
双目运算符 |
|
11 |
&& |
逻辑与 |
表达式&&表达式 |
从左到右 |
双目运算符 |
|
12 |
|| |
逻辑或 |
表达式||表达式 |
从左到右 |
双目运算符 |
|
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
从右到左 |
三目运算符 |
|
14 |
= |
赋值运算符 |
变量=表达式 |
从右到左 |
-- |
|
/= |
除后赋值 |
变量/=表达式 |
-- | ||
|
*= |
乘后赋值 |
变量*=表达式 |
-- | ||
|
%= |
取模后赋值 |
变量%=表达式 |
-- | ||
|
+= |
加后赋值 |
变量+=表达式 |
-- | ||
|
-= |
减后赋值 |
变量-=表达式 |
-- | ||
|
<<= |
左移后赋值 |
变量<<=表达式 |
-- | ||
|
>>= |
右移后赋值 |
变量>>=表达式 |
-- | ||
|
&= |
按位与后赋值 |
变量&=表达式 |
-- | ||
|
^= |
按位异或后赋值 |
变量^=表达式 |
-- | ||
|
|= |
按位或后赋值 |
变量|=表达式 |
-- | ||
|
15 |
, |
逗号运算符 |
表达式,表达式,… |
从左到右 |
-- |
从上表我们可以看到"++"与"*"运算的优先级相同,运算顺序为从右向左.
二:++p与p++的区别
++p:先自增再取值
p++:先取值再自增
具体看下图

三:*p++、*(p++)、*++p、*(++p)、(*p)++、++*p区别和用法
1:*p++
按从右向左的结合原则,*p++求值的顺序即为先"++"后"*",即:*(p++)。
再根据p++的运算先取值再自增,即为先取*p,然后进行p++的自增操作。
表达式a=*p++可等同于下面两条语句:

2:*(p++)
同上述1
3:*++p
按从右向左的结合原则,*++p求值的顺序即为先"++"后"*",即:*(++p)。
再根据++p的运算先自增再取值,即为先进行p++的自增操作,然后取*p
此时*p指向的内容会发生改变,变为数组的下一位
表达式a=*++p可等同于下面两条语句:

4:*(++p)
同上述3
5:(*p)++
由于括号内优先运算,所以表达式先取出*p(假设为arr[1])的值并赋给a,然后讲*p的值arr[1]所代表的内容加1。
表达式a=(*p)++可等同于下面两条语句:

6:++*p
按从右向左的结合原则,++*p求值的顺序即为先进行“*”,然后再进行“++”运算,即先取出*p的值并赋给a,然后将*p的值arr[1]加1,但*p指向的内容不变。
表达式a=++*p可等同于下面两条语句:

本文聚焦C语言中'*'和'++'运算符,先介绍了二者运算优先级相同且从右向左运算。接着阐述了++p与p++的区别,前者先自增再取值,后者先取值再自增。最后详细分析了*p++、*(p++)等六种组合的区别和用法。
++、++*p区别和用法&spm=1001.2101.3001.5002&articleId=134439567&d=1&t=3&u=311f5df05ee240ce8f89c3edc391059a)
5493

被折叠的 条评论
为什么被折叠?



