记住这个优先级顺序,这比什么都重要:

(逻辑非) > && (逻辑与) > (逻辑或)
这个顺序意味着,在一个表达式中, 会最先被计算,然后是 &&,最后才是 。
详细解释与示例
为了更好地理解,我们通过一些例子来看这个优先级是如何工作的,我们假设:
a = 1(真)b = 0(假)c = 1(真)
(逻辑非) - 优先级最高
是一个单目运算符(只需要一个操作数),它的优先级非常高,仅次于像 , , 这样的运算符。

示例:!a && b
根据优先级,这实际上被解释为 (!a) && b。
- 计算
!a:因为a是真 (1),!a是假 (0)。 - 表达式变为
0 && b。 - 计算
0 && b:只要有一个操作数为假,整个&&表达式就为假,所以结果是0(假)。
如果错误地忽略优先级,可能会写成 !(a && b),这完全是不同的表达式:
- 计算
a && b:1 && 0,结果是0(假)。 - 计算
!(0),结果是1(真)。
!a && b 不等于 !(a && b),优先级至关重要。

&& (逻辑与) - 优先级居中
&& 的优先级高于 。
示例:a && b || c
根据优先级,这实际上被解释为 (a && b) || c。
- 计算
a && b:1 && 0,结果是0(假)。 - 表达式变为
0 || c。 - 计算
0 || c:0 || 1,结果是1(真)。
如果错误地忽略优先级,可能会写成 a && (b || c),这结果也不同:
- 计算
b || c:0 || 1,结果是1(真)。 - 计算
a && 1:1 && 1,结果是1(真)。 (在这个特定例子中,结果碰巧相同,但这只是巧合,不能作为普遍规律。)
另一个示例:a || b && c
根据优先级,这被解释为 a || (b && c)。
- 计算
b && c:0 && 1,结果是0(假)。 - 表达式变为
a || 0。 - 计算
1 || 0,结果是1(真)。
(逻辑或) - 优先级最低
的优先级是这三个逻辑运算符中最低的。
示例:!a || b && c
根据完整的优先级顺序 ! > && > ||,这被解释为 (!a) || (b && c)。
- 计算
!a:!1,结果是0(假)。 - 计算
b && c:0 && 1,结果是0(假)。 - 表达式变为
0 || 0。 - 最终结果是
0(假)。
优先级速查表
为了方便你与其他运算符比较,这里列出了一些常见运算符的优先级(从高到低)。
| 运算符 | 描述 | 结合性 |
|---|---|---|
[] -> |
括号、数组、结构体成员/指针 | 从左到右 |
(单目) (解引用) & (取地址) sizeof |
逻辑非、按位取反、自增、自减、正负、解引用、取地址、求大小 | 从右到左 |
| 乘、除、取模 | 从左到右 | |
| 加、减 | 从左到右 | |
<< >> |
左移、右移 | 从左到右 |
< <= > >= |
关系运算符 | 从左到右 |
| 等于、不等于 | 从左到右 | |
& |
按位与 | 从左到右 |
^ |
按位异或 | 从左到右 |
| 按位或 | 从左到右 | |
&& |
逻辑与 | 从左到右 |
| 逻辑或 | 从左到右 | |
| 条件运算符 (三元运算符) | 从右到左 | |
&= ^= <<= >>= |
赋值运算符 | 从右到左 |
| 逗号运算符 | 从左到右 |
从这个表中你可以看到:
- 的优先级高于 等算术运算符。
&&和 的优先级低于所有关系运算符(<,>=等)和相等性运算符(, )。&&的优先级高于 。
最佳实践:使用括号提高可读性
虽然记住优先级很重要,但在实际编程中,最好的做法是使用括号 来明确地表达你的意图,这可以避免你和阅读代码的人产生误解,让代码更清晰、更健壮。
不推荐的写法(依赖优先级):
if (x > 10 && y < 5 || z == 0)
这个表达式到底是 (x > 10 && y < 5) || z == 0 还是 x > 10 && (y < 5 || z == 0)?虽然根据优先级我们知道是前者,但阅读时需要停下来思考一下。
强烈推荐的写法(使用括号):
if ((x > 10 && y < 5) || (z == 0))
或者,如果你想表达后者的逻辑:
if (x > 10 && (y < 5 || z == 0))
加了括号后,代码的意图一目了然,无需记忆优先级规则。
- 优先级顺序: >
&&> 。 - 记忆技巧:
not比and强,and比or强。 - 关键区别:
!a && b和!(a && b)完全不同。 - 最佳实践:当不确定或为了清晰时,请毫不犹豫地使用括号 ,清晰的代码比“聪明”的代码更有价值。
