C语言中&&优先级高于||,故a||b&&c等价于a||(b&&c);同理,&位与优先级高于==,p++因后缀++结合性为(p++);赋值=优先级低于==,a==b=c被解析为a==(b=c),易引发bug。

为什么 && 比 || 优先级高,但写成 a || b && c 却先算 b && c
因为 C 语言中逻辑与 && 确实比逻辑或 || 优先级高,这不是错觉。它和数学里 * 比 + 优先算一个道理:表达式 a || b && c 等价于 a || (b && c),不是 (a || b) && c。很多初学者误以为“从左到右就该先算左边”,但运算符优先级会强行插入括号。
Python 完全一致——and 优先级也高于 or,所以 a or b and c 同样等价于 a or (b and c)。这点上两者没区别,不用对比记。
真正容易出错的是混用位运算和逻辑运算:
-
a & b == c实际是a & (b == c),不是(a & b) == c(==优先级高于&) -
a == b & c同样被解析为a == (b & c),但如果本意是先比较再按位与,就必须加括号 - Python 中
&是位与,and是逻辑与;C 中&是位与,&&是逻辑与——别把 Python 的and/or和 C 的&/|混着想
++ 和 * 连用时为什么 *p++ 先取值再自增
因为后缀自增 p++ 的优先级(2)高于解引用 *(3)?不,恰恰相反:* 和 ++ 都是单目运算符,优先级相同,此时靠结合性——右结合。但 p++ 是后缀形式,它“整体”作为一个表达式,其值是自增前的 p,而 * 作用于这个值。
立即学习“Python免费学习笔记(深入)”;
所以 *p++ 等价于 *(p++),不是 (*p)++。如果要先解引用再对所指内容自增,得写 (*p)++;如果要先自增指针再解引用,得写 *++p 或 *(++p)。
Python 没有 ++ 运算符,所以这个坑只在 C/C++ 里存在。别试图用 Python 类比记忆——它根本不存在这个操作。
赋值运算符 = 居然比 == 优先级低?
是的,而且这是 C 语言里最常引发 bug 的优先级陷阱之一。a == b = c 会被解析为 a == (b = c),先执行赋值,再做相等判断。这在 if 条件里尤其危险:
if (a = 5) { ... } // 不是判断 a 是否等于 5,而是把 5 赋给 a,然后判断 5 是否非零
编译器通常会警告,但若写成 if (a == b = c),就更隐蔽了。Python 完全规避这个问题:赋值不是表达式,不能出现在条件中,if a == b = c: 直接语法错误。
其他易踩点:
-
&(位与)优先级高于==,所以a & b == c≠(a & b) == c -
+和-优先级相同且左结合,a - b + c就是(a - b) + c,没问题 -
?:(三目)优先级很低,仅高于赋值类运算符,a = b ? c : d不用括号也安全
怎么快速查、少记、不翻书
别背整张表。日常够用的只有 10 个左右核心层级:
- 括号
()、下标[]、成员访问. ->最高 - 单目:
!~++--*&(type) - 乘除模:
*/% - 加减:
+- - 移位:
>> - 关系:
>>= - 相等:
==!= - 位与:
& - 位异或:
^ - 位或:
| - 逻辑与:
&& - 逻辑或:
|| - 三目:
?: - 赋值:
=+=等(全部右结合)
不确定时,宁可多打括号。C 标准明确说:括号不降低性能,现代编译器完全优化掉。Python 用户转 C 时最容易忽略的,就是把“可读性优先”当成“可以不加括号”,结果在 &、==、= 附近栽跟头。











