You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言条件判断中&&优先级高于||但求值结果不符合预期疑问

你混淆了运算符优先级和表达式求值顺序两个概念,这个现象不是编译器bug。

核心原理

  • 运算符优先级只决定表达式的结合分组方式,不改变逻辑运算符的短路求值规则,也不强制优先级高的子表达式先求值。
  • 逻辑或||是左结合、带短路特性的运算符:只要左侧操作数求值为真,右侧所有后续表达式都不会执行。

原表达式的分组与求值过程

首先根据&&优先级高于||的规则,原条件表达式会被编译器解析为如下分组:

(a++>0) || (++b==1) || ( (c--<=0) && (d++>c--) )

求值顺序严格从左到右执行:

  1. 先算a++>0:初始a=0,先取0判断0>0为假,a自增为1。由于左侧为假,继续计算第一个||的右侧。
  2. 再算++b==1:b先自增为1,判断1==1为真。此时第一个||的整体结果为真,触发短路逻辑:后续所有||右侧的表达式(也就是你认为优先级更高的&&组合部分)完全不会执行,c和d的值保持初始的0不变。
  3. 整个条件表达式结果为真,进入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:04