Java中短路求值与前缀递增运算符的执行顺序问题
拆解你的Java布尔表达式问题
好问题!这确实是个容易混淆的点,咱们一步步拆解来看,把逻辑理清楚:
首先明确运算符优先级
在Java中,&&(逻辑与)的优先级比||(逻辑或)更高,所以你的if条件会被Java自动解析成如下结构:
if( (++e>21) || ( (++e>21) && (f>30) ) )
这是核心前提,优先级搞反了的话,整个执行逻辑就全错了。
短路求值的规则回顾
咱们再复习一下短路求值的关键规则:
- 对于
||:只要左边表达式结果为true,右边的所有表达式都会被直接跳过(因为逻辑或只要有一个为真,整体就为真);只有左边为false时,才会去计算右边的内容。 - 对于
&&:只要左边表达式结果为false,右边的所有表达式都会被直接跳过(因为逻辑与只要有一个为假,整体就为假);只有左边为true时,才会计算右边的内容。
代入初始值一步步执行
初始值是e=20,f=25,咱们逐行走:
- 计算
||左边的++e>21:- 前缀递增
++e会先把e的值加1,此时e变成21 - 判断
21>21?结果是false
- 前缀递增
- 因为
||左边是false,必须计算右边的(++e>21) && (f>30):- 先算
&&左边的++e>21:- 前缀递增
++e把e从21再加1,此时e变成22 - 判断
22>21?结果是true
- 前缀递增
- 因为
&&左边是true,必须计算右边的f>30:- f的值是25,判断
25>30?结果是false
- f的值是25,判断
- 所以
&&整体的结果是true && false = false
- 先算
- 现在
||的整体结果是false || false = false,所以if语句块里的System.out.println("Hi");不会执行。 - 最后执行
System.out.println(e);,输出的就是22。
关键总结
- 千万不要忽略运算符优先级,
&&比||优先级高,所以右边是一个完整的&&表达式,不是先算||再算&& - 前缀
++是先改变变量值,再参与判断,每执行一次++e,e的值就会更新 - 短路求值只会跳过“完全不必要”的部分,这里因为
||左边为假,所以必须执行右边的&&表达式,而&&左边为真,所以又必须执行右边的f>30判断
内容的提问来源于stack exchange,提问作者MrJ
相关产品推荐
相关产品推荐

