运算符优先级查看和记忆口诀

优先级:就是当一个表达式中有多个运算符时,先计算谁,后计算谁。

运算符还有“”和“结合性”的概念:

“目”就是“眼睛”的意思,一个运算符需要几个数就叫“几目”。

那么“结合性”是什么呢?

优先级都是关于优先级不同的运算符参与运算时先计算谁后计算谁。但是如果运算符的优先级相同,那么先计算谁后计算谁呢?这个就是由“结合性”决定的。

C语言中大多数运算符的结合性都是从左往右,只有三个运算符是从右往左的。

一个是单目运算符,另一个是三目运算符,还有一个就是双目运算符中的赋值运算符=

双目运算符中只有赋值运算符的结合性是从右往左的,其他的都是从左往右。

 

运算符优先级和结合性一览表

序号

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

1

[]

数组下标

数组名[常量表达式]

从左到右

2

()

圆括号

(表达式)
函数名(形参表)

3

.

成员选择(对象)

对象.成员名

4

->

成员选择(指针)

对象指针->成员名

5

2

负号运算符

表达式

从右到左

单目运算符

6

(类型)

强制类型转换

(数据类型)表达式

7

++

自增运算符

++变量名
变量名++

单目运算符

8

自减运算符

变量名
变量名–

单目运算符

9

*

取值运算符

*指针变量

单目运算符

10

&

取地址运算符

&变量名

单目运算符

11

!

逻辑非运算符

!表达式

单目运算符

12

~

按位取反运算符

~表达式

单目运算符

13

sizeof

长度运算符

sizeof(表达式)

14

3

/

表达式 / 表达式

从左到右

双目运算符

15

*

表达式*表达式

双目运算符

16

%

余数(取模)

整型表达式%整型表达式

双目运算符

17

4

+

表达式+表达式

从左到右

双目运算符

18

表达式-表达式

双目运算符

19

5

<<

左移

变量<<表达式

从左到右

双目运算符

20

>>

右移

变量>>表达式

双目运算符

21

6

>

大于

表达式>表达式

从左到右

双目运算符

22

>=

大于等于

表达式>=表达式

双目运算符

23

<

小于

表达式<表达式

双目运算符

24

<=

小于等于

表达式<=表达式

双目运算符

25

7

==

等于

表达式==表达式

从左到右

双目运算符

26

!=

不等于

表达式!= 表达式

双目运算符

27

8

&

按位与

表达式&表达式

左到右

双目运算符

28

9

^

按位异或

表达式^表达式

左到右

双目运算符

29

10

|

按位或

表达式|表达式

左到右

双目运算符

30

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

31

12

||

逻辑或

表达式||表达式

左到右

双目运算符

32

13

?:

条件运算符

表达式1? 表达式2: 表达式3

从右到左

三目运算符

33

14

=

赋值运算符

变量=表达式

从右到左

34

/=

除后赋值

变量/=表达式

35

*=

乘后赋值

变量*=表达式

36

%=

取模后赋值

变量%=表达式

37

+=

加后赋值

变量+=表达式

38

-=

减后赋值

变量-=表达式

39

<<=

左移后赋值

变量<<=表达式

40

>>=

右移后赋值

变量>>=表达式

41

&=

按位与后赋值

变量&=表达式

42

^=

按位异或后赋值

变量^=表达式

43

|=

按位或后赋值

变量|=表达式

44

15

,

逗号运算符

表达式,表达式,…

左到右

一些容易出错的优先级问题

优先级问题

表达式

经常误认为的结果

实际结果

. 的优先级高于 *   (-> 操作符用于消除这个问题)

*p.f

p 所指对象的字段 f,等价于:
(*p).f

对 p 取 f 偏移,作为指针,然后进行解除引用操作,等价于:

*(p.f)

[] 高于 *

int *ap[]

ap 是个指向 int 数组的指针,等价于:
int (*ap)[]

ap 是个元素为 int 指针的数组,等价于:
int *(ap [])

函数 () 高于 *

int *fp()

fp 是个函数指针,所指函数返回 int,等价于:
int (*fp)()

fp 是个函数,返回 int*,等价于:
int* ( fp() )

== 和 != 高于位操作

(val & mask != 0)

(val &mask) != 0

val & (mask != 0)

== 和 != 高于赋值符

c = getchar() != EOF

(c = getchar()) != EOF

c = (getchar() != EOF)

算术运算符高于位移 运算符

msb << 4 + lsb

(msb << 4) + lsb

msb << (4 + lsb)

C语言运算符优先级和口诀

一共有十五个优先级:同一优先级的运算符,运算次序由结合方向所决定

1   ()  []  .  ->        (括号,成员排第一)

2   !  ~   –(负号) ++  —   &(取变量地址)*  

(type)(强制类型)    sizeof    (单目运算排第二)

3   * / %                     (乘除余三)

4   + –                (加减四)

5   >> <<              (移位五)

6   > >= < <=            (关系六)

7   == !=               (等于不等排第七)

8   &                (位“与”) 

9   ^                (“异或”)

10  |                (和位”或”)三分天下八九十

11  &&               (逻辑 “与”)

12  ||              (和“或”)十一和十二

13  ?:              (条件运算符)

14   =  +=  -=  *=  /=   %=

 |=   ^=   &=   >>=   <<=(条件高于赋值)

15  ,               (逗号优先级最低)

优先级:!> 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。

括号成员第一;     //括号运算符[]() 成员运算符.  ->

全体单目第二;    //所有的单目运算符比如++、 –、 +(正)、 -(负) 、指针运算*、&

乘除余三,加减四;   //这个”余”是指取余运算即%

移位五,关系六;    //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七; //即== 和!=

位与异或和位或;   //这几个都是位运算: 位与(&)异或(^)位或(|)    

三分天下”八九十;  

逻辑或跟与;      //逻辑运算符:|| 和 &&

十二和十一;      //注意顺序:优先级(||)  底于 优先级(&&) 

条件高于赋值,     //三目运算符优先级排到13 位只比赋值运算符和”,”高

逗号运算级最低!   //逗号运算符优先级最低 

    原文作者:October autumn
    原文地址: https://blog.csdn.net/qq_36062399/article/details/120146706
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞