C语言中使用多个逻辑运算符时的意外短路求值问题
C语言逻辑运算符优先级与短路求值规则解答
你的困惑本质是混淆了运算符优先级和短路求值的作用边界两个概念,C语言中逻辑运算的执行顺序首先由优先级决定分组,再在单个逻辑运算的计算过程中应用短路规则,具体推导如下:
基础前提
- C语言中
&&的优先级高于||,所有表达式会先按照优先级、结合性完成分组后再执行运算 - 短路求值仅作用于当前正在计算的逻辑运算符的右操作数,不会打破优先级分组规则
第一个表达式1 || 0 && 0推导
按照&&优先级更高的规则,该表达式等价于1 || (0 && 0):
- 先计算
||的左操作数,值为1(逻辑真) - 对于
||运算来说,左操作数为真时即可确定整体结果为真,触发短路,直接返回1,无需计算右侧(0 && 0)部分
你对该表达式的理解是正确的。
第二个表达式0 && 0 || 1推导
同样按照&&优先级更高的规则,该表达式等价于(0 && 0) || 1,而非你误解的0 && (0 || 1):
- 先计算
||的左操作数,也就是(0 && 0)分组 - 计算
&&时左操作数为0(逻辑假),触发&&的短路,直接返回0,无需计算&&右侧的0 - 回到
||运算,左操作数结果为0(逻辑假),无法直接确定结果,需要继续计算右操作数1 - 右操作数为
1(逻辑真),最终整个表达式结果为1
补充验证
如果显式用括号改变分组,写成0 && (0 || 1),此时优先级分组后&&的右操作数是(0 || 1),计算&&时左操作数为0触发短路,会直接返回0,不会执行右侧的||运算。
内容的提问来源于stack exchange,提问作者Mujahid Ali
相关产品推荐
相关产品推荐

