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