一、C 语言运算符优先级概述
上课的时候,老师突然提及了运算符的优先级。在最初学习的时候,我原本并未特别留意这些内容,但经过一番思考后,我认为还是有必要将运算符的优先级进行梳理,以便于记忆。
C语言的运算符有两大特性:
1. 优先级: C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理。
2. 结合性: C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z 则 y 应先与“-”号结合,执行 x-y 运算,然后再执行 +z 的运算。这种自左至右的结合 方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。如 x=y=z ,由于“=”的右结合性,应先执行 y=z 再执行 x=(y=z) 运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
二、优先级详细表格(优先级、运算符、含义、运算类型、结合方向)
优先级 | 运算符 | 含义 | 运算类型 | 结合方向 |
1 | () [ ] -> . ++ -- | 圆括号、 函数参数表 后缀增1、 后缀减1 | ————— | 自左向右 |
2 | ! ~ ++ -- - * & (类型标识符) sizeof | 逻辑非 前缀减1 计算字节数运算符 | 单目运算 | 自右向左 |
3 | * / % | 乘、 除、 整数求余 | 双目算术运算 | 自左向右 |
4 | + - | 加、 减 | 双目算术运算 | 自左向右 |
5 | >> << | 左移、 右移 | 位运算 | 自左向右 |
6 | < <= > >= | 小于、 小于等于 大于、 大于等于等于 | 关系运算 | 自左向右 |
7 | == != | 等于、 不等于 | 关系运算 | 自左向右 |
8 | & | 按位与 | 位运算 | 自左向右 |
9 | ^ | 按位异或 | 位运算 | 自左向右 |
10 | | | 按位或 | 位运算 | 自左向右 |
11 | && | 逻辑与 | 逻辑运算 | 自左向右 |
12 | || | 逻辑或 | 逻辑运算 | 自左向右 |
13 | ? : | 条件运算符 | 三目运算 | 自右向左 |
14 | = += -= /= *= %= &= ^= |= <<= >>= | 赋值运算符 复合的赋值运算符 | 双目运算 | 自右向左 |
15 | , | 逗号运算符 | 顺序求值运算 | 自左向右 |
三、备注:
如果是同一级的运算符,就遵循结合性。
对于数字类型来说优先级:括号(())>!>算术运算符(+,-,*,/)>关系运算符(<,<=,>,>=)>&&>||>赋值运算符(=,%=,/=.......)>逗号运算符(,)
规律
-
结合方向只有三个是从右往左,其余都是从左往右。
-
所有双目运算符中只有赋值运算符的结合方向是从右往左。
-
另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
-
C语言中有且只有一个三目运算符。
-
逗号运算符的优先级最低,要记住。
-
此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。