因为C标准规定&&属于“逻辑AND表达式”层级(优先级11),+属于更靠前的“加法表达式”层级(优先级4),优先级数值越小结合越早。

为什么 && 的优先级比 + 低?
因为 C 标准规定逻辑与运算符 && 属于“逻辑 AND 表达式”层级,而加法运算符 + 属于更靠前的“加法表达式”层级。优先级数值越小,实际结合越早——+ 的优先级是 4,&& 是 11(C17 标准附录 A),中间隔着关系运算符(、== 等)、位运算、赋值等共 6 层。
a + b && c 实际怎么解析?
它等价于 (a + b) && c,不是 a + (b && c)。这是由优先级和左结合性共同决定的:
-
+优先级高,先算a + b,结果为整型(非零即真) - 再将该结果与
c做逻辑与:若a + b为 0,整个表达式短路,c不求值 -
c类型不影响逻辑结果,但若它是带副作用的表达式(如func()),可能不会执行
常见误用场景:把 && 当成“和”直接连条件
比如想判断 x 是否在区间 [3, 7] 内,写成 3 是对的;但若写成 x >= 3 && 就会编译失败——&& 两边都必须是完整表达式,不能省略左操作数。
另一个典型错误是混用位运算和逻辑运算:
立即学习“C语言免费学习笔记(深入)”;
-
if (flags & MASK_A && flags & MASK_B)—— 正确,两个位测试结果再逻辑与 -
if (flags & MASK_A && MASK_B)—— 错误,MASK_B非零即真,逻辑上恒成立,且掩盖了本意
查优先级表时最易忽略的一点
优先级表里同一行的运算符优先级相同,但结合性不同:&& 是左结合,而 = 是右结合。这意味着 a && b && c 等价于 (a && b) && c,但 a = b = c 等价于 a = (b = c)。很多人只记数字不看结合性,导致嵌套逻辑或赋值链出错。











