运算符的优先级
运算符的优先级决定了在一个表达式中有多个运算符时,哪个运算符首先被执行。
让我们看一个例子
int x = 5 - 17* 6;
在 C 语言中,* 的优先级高于 - 和 =。因此,首先计算 17 * 6。然后计算涉及 - 的表达式,因为 - 的优先级高于 =。
以下是运算符优先级从高到低的表格。结合性的属性将在稍后讨论。
运算符优先级和结合性表
| 运算符 | 运算符含义 | 结合性 |
|---|---|---|
| () [] -> . |
函数调用 数组元素引用 间接成员选择 直接成员选择 |
从左到右 |
| ! ~ + - ++ -- & * sizeof (类型) |
逻辑非 按位(1 的)补码 一元加 一元减 递增 递减 解引用 (地址) 指针引用 返回对象的大小 类型转换 (转换) |
从右到左 |
| * / % |
乘 除法 余数 |
从左到右 |
| + - |
二元加 (加法) 二元减 (减法) |
从左到右 |
| << >> |
左移 右移 |
从左到右 |
| < <= > >= |
小于 小于或等于 大于 大于或等于 |
从左到右 |
| == != |
等于 不等于 |
从左到右 |
| & | 按位与 | 从左到右 |
| ^ | 按位异或 | 从左到右 |
| | | 按位或 | 从左到右 |
| && | 逻辑与 | 从左到右 |
| || | 逻辑或 | 从左到右 |
| ?: | 条件运算符 | 从右到左 |
| = *= /= %= += -= &= ^= |= <<= >>= |
简单赋值 乘法赋值 除法赋值 取模赋值 加法赋值 减法赋值 按位与赋值 按位异或赋值 按位或赋值 左移赋值 右移赋值 |
从右到左 |
| , | 表达式分隔符 | 从左到右 |
运算符的结合性
运算符的结合性决定了表达式的计算方向。例如,
b = a;
在这里,a 的值被赋给了 b,而不是反过来。这是因为 = 运算符的结合性是从右到左的。
此外,如果存在两个具有相同优先级 (priority) 的运算符,结合性决定了它们的执行方向。
让我们看一个例子
1 == 2 != 3
在这里,运算符 == 和 != 具有相同的优先级。而且,它们的结合性是从左到右的。因此,首先计算 1 == 2。
上面的表达式等价于
(1 == 2) != 3
注意: 如果一个语句有多个运算符,您可以使用括号 () 使代码更易读。
