优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
0 |
( ) |
圆括号运算符 |
(表达式) |
/ |
提高表达式运算优先级 |
1 |
后置++ |
后置自增运算符 |
变量名++ |
左到右 |
单目运算符 |
后置-- |
后置自减运算符 |
变量名-- | |||
[ ] |
数组下标运算符 |
数组名[整型表达式] |
/
| ||
( ) |
圆括号运算符 |
函数名(形参表) | |||
. |
结构成员运算符 |
结构体变量.成员名 | |||
-> |
分量运算符/间接成员运算符 |
结构体指针->成员名 | |||
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
(类型) |
强制类型转换 |
(数据类型)表达式 | |||
前置++ |
前置自增运算符 |
++变量名 | |||
前置-- |
前置自减运算符 |
--变量名 | |||
* |
取值运算符 |
*指针表达式 | |||
& |
取地址运算符 |
&左值表达式 | |||
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 | |||
% |
取模(取余) |
整型表达式%整型表达式 | |||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 | |||
5 |
<< |
左移 |
表达式<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
表达式>>表达式 | |||
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 | |||
< |
小于 |
表达式<表达式 | |||
<= |
小于等于 |
表达式<=表达式 | |||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!=表达式 | |||
8 |
& |
按位与 |
整型表达式&整型表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
整型表达式^整型表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
整型表达式|整型表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1?表达式2:表达式3 |
右到左 |
三目运算符 |
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
双目运算符 |
/= |
除后赋值 |
变量/=表达式 | |||
*= |
乘后赋值 |
变量*=表达式 | |||
%= |
取模后赋值 |
变量%=表达式 | |||
+= |
加后赋值 |
变量+=表达式 | |||
-= |
减后赋值 |
变量-=表达式 | |||
<<= |
左移后赋值 |
变量<<=表达式 | |||
>>= |
右移后赋值 |
变量>>=表达式 | |||
&= |
按位与后赋值 |
变量&=表达式 | |||
^= |
按位异或后赋值 |
变量^=表达式 | |||
|= |
按位或后赋值 |
变量|=表达式 | |||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
从左向右顺序运算 |
C 语言的运算符优先级表
最新推荐文章于 2025-06-20 17:22:50 发布
这个 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