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

Java中短路求值与前缀递增运算符的执行顺序问题

拆解你的Java布尔表达式问题

好问题!这确实是个容易混淆的点,咱们一步步拆解来看,把逻辑理清楚:

首先明确运算符优先级

在Java中,&&(逻辑与)的优先级比||(逻辑或)更高,所以你的if条件会被Java自动解析成如下结构:

if( (++e>21) || ( (++e>21) && (f>30) ) )

这是核心前提,优先级搞反了的话,整个执行逻辑就全错了。

短路求值的规则回顾

咱们再复习一下短路求值的关键规则:

  • 对于||:只要左边表达式结果为true,右边的所有表达式都会被直接跳过(因为逻辑或只要有一个为真,整体就为真);只有左边为false时,才会去计算右边的内容。
  • 对于&&:只要左边表达式结果为false,右边的所有表达式都会被直接跳过(因为逻辑与只要有一个为假,整体就为假);只有左边为true时,才会计算右边的内容。

代入初始值一步步执行

初始值是e=20,f=25,咱们逐行走:

  1. 计算||左边的++e>21:
    • 前缀递增++e会先把e的值加1,此时e变成21
    • 判断21>21?结果是false
  2. 因为||左边是false,必须计算右边的(++e>21) && (f>30):
    • 先算&&左边的++e>21:
      • 前缀递增++e把e从21再加1,此时e变成22
      • 判断22>21?结果是true
    • 因为&&左边是true,必须计算右边的f>30:
      • f的值是25,判断25>30?结果是false
    • 所以&&整体的结果是true && false = false
  3. 现在||的整体结果是false || false = false,所以if语句块里的System.out.println("Hi");不会执行。
  4. 最后执行System.out.println(e);,输出的就是22。

关键总结

  • 千万不要忽略运算符优先级,&&比||优先级高,所以右边是一个完整的&&表达式,不是先算||再算&&
  • 前缀++是先改变变量值,再参与判断,每执行一次++e,e的值就会更新
  • 短路求值只会跳过“完全不必要”的部分,这里因为||左边为假,所以必须执行右边的&&表达式,而&&左边为真,所以又必须执行右边的f>30判断

内容的提问来源于stack exchange,提问作者MrJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:26:18