C 语言的运算符优先级表

来源:互联网 发布:怎么使用办公软件 编辑:程序博客网 时间:2024/06/11 11:24

优先级

运算符

名称或含义

使用形式

结合方向

说明

0

( )

圆括号运算符

(表达式)

/

提高表达式运算优先级

1

后置++

后置自增运算符

变量名++

左到右

单目运算符

后置--

后置自减运算符

变量名--

[ ]

数组下标运算符

数组名[整型表达式]

 

/

 

( )

圆括号运算符

函数名(形参表)

.

结构成员运算符

结构体变量.成员名

->

分量运算符/间接成员运算符

结构体指针->成员名

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

前置++

前置自增运算符

++变量名

前置--

前置自减运算符

--变量名

*

取值运算符

*指针表达式

&

取地址运算符

&左值表达式

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

取模(取余)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<< 

左移

表达式<<表达式

左到右

双目运算符

>> 

右移

表达式>>表达式

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!=表达式

8

&

按位与

整型表达式&整型表达式

左到右

双目运算符

9

^

按位异或

整型表达式^整型表达式

左到右

双目运算符

10

|

按位或

整型表达式|整型表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

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

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

双目运算符

/=

除后赋值

变量/=表达式

*=

乘后赋值

变量*=表达式

%=

取模后赋值

变量%=表达式

+=

加后赋值

变量+=表达式

-=

减后赋值

变量-=表达式

<<=

左移后赋值

变量<<=表达式

>>=

右移后赋值

变量>>=表达式

&=

按位与后赋值

变量&=表达式

^=

按位异或后赋值

变量^=表达式

|=

按位或后赋值

变量|=表达式

15

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算


这个 C 语言优先级表是网上搜集后整理的, 算是比较准确的一个版本了, 网上有很多优先级表都存在一定的错误。关于这张优先级表有几点需要说明:
1. 这张表的 0 优先级完全是我自己加上去的, 原因是「()」这个运算符比较特殊。 除了作函数形参表之外, 它可以起到类似提高运算优先级的作用, 可以说在整个优先级表括号的优先级最高。
2. 这张表格完全没有必要会背, 这实在不应该是一个程序员去做的事情, 应该要做的就是去理解和会查表。
3. 注意只有相邻的运算符才有讨论优先级的必要性,比如「++a - b」,需要知道变量 a 前面的前置 ++ 运算符和它后面减号运算的优先级顺序。 大多数情况下,很多运算符压根就凑不到一块去, 也就没有必要讨论它们的优先级情况了。
4. 大多数时候对一些优先级无法一眼看出的表达式建议使用括号, 大多数时候写代码无需查找优先级表, 一个括号就可以解决, 同时还增加了代码可读性。 比如 1<< 1 + 1 & 5等价于 ( 1 << ( 1 + 1 ) ) & 5, 有括号时会更加清晰。
5. 需要使用这张表格的情况有两种:
(1). 看一些奇怪的表达式, 类似上面提到的1<< 1 + 1 & 5,很难一眼看出运算顺序的。
(2). 一些常规但是容易犯错的表达式:
      比如 *p[10], 这个在指针篇(4)中已经提到过。查这张表就能明白它为什么是数组,而不是指针了。
6. 同一优先级的运算符运算次序由结合顺序决定。 比如「a = b *= c」,「=」和「*=」都是从左往右结合,所以先算「*=」, 再算「=」。假设初始值 「a = 1, b = 2, c = 3」。由于赋值类运算符的结合顺序都是从右往左, 那么计算顺序就是「 b = b*c; a = b;」 结果 「a = 6, b = 6, c = 3;」。 
7. 严禁写出类似于 b = (a++) + (a++) 这样的代码, 假设 a 和 b 的初始值都为 0, 计算后 a = ? b =? 读者不妨可以试试在多个编译器下测试下, 就知道这样的代码有多么误人子弟了, 然而现在大学的教科书和考试当中依旧大量存在着这样的代码。 这个问题的答案会在下一篇博文中说明。


一些小练习(请自行编码验证):
1. a = 1 | 1 & 0;a = ?
2. a = 1 || 1 && 0;a = ?
3. 判断以下几个 if 语句(明白括号的重要性):
if( 1 | 0 == 1 & 1 )
if( 1 | 0 != 1 & 1 )
if( 1 & 0 == 1 | 1 )


2017 年 8 月 23 日
Kilento 

原创粉丝点击