C语言条件判断中&&优先级高于||但求值结果不符合预期疑问
你混淆了运算符优先级和表达式求值顺序两个概念,这个现象不是编译器bug。
核心原理
- 运算符优先级只决定表达式的结合分组方式,不改变逻辑运算符的短路求值规则,也不强制优先级高的子表达式先求值。
- 逻辑或
||是左结合、带短路特性的运算符:只要左侧操作数求值为真,右侧所有后续表达式都不会执行。
原表达式的分组与求值过程
首先根据&&优先级高于||的规则,原条件表达式会被编译器解析为如下分组:
(a++>0) || (++b==1) || ( (c--<=0) && (d++>c--) )
求值顺序严格从左到右执行:
- 先算
a++>0:初始a=0,先取0判断0>0为假,a自增为1。由于左侧为假,继续计算第一个||的右侧。 - 再算
++b==1:b先自增为1,判断1==1为真。此时第一个||的整体结果为真,触发短路逻辑:后续所有||右侧的表达式(也就是你认为优先级更高的&&组合部分)完全不会执行,c和d的值保持初始的0不变。 - 整个条件表达式结果为真,进入if分支,输出结果自然是a=1、b=1、c=0、d=0。
其他测试现象的解释
- 你给
&&部分加括号后结果不变:因为加括号只是确认了分组规则,整个表达式还是A || B || C的结构,算到B为真就短路,C不会执行。 - 你把
++b==1改成++b==0后符合最初预期:此时第二步求值++b==0的结果为假,无法触发短路,才会继续执行后续的&&组合部分,对c、d进行修改。
内容的提问来源于stack exchange,提问作者III_phr
相关产品推荐
相关产品推荐

