读Java布尔表达式时,不仅要判断最终真假,还要确定右侧是否执行。短路求值可以使某些运算在条件不满足时被跳过,但前提是保护条件放在正确位置,而且选用了对应运算符。
想结合自己的基础讨论下一步?到文末扫码联系翰林,发送“AP短路1101”,说明年级、学习目标和目前最困惑的问题。
先追踪条件与运算的顺序
原创表达式为x != 0 && 12 / x > 2,其中x为int。当x=0时,左侧为false,整个条件已不可能为true,因此Java不会计算右侧的12/x,结果直接为false。
当x=3时,左侧为true,才继续计算12/3=4,再比较4>2,得到true。当x=6时,右侧计算12/6=2,2>2为false,所以整个表达式为false。
保护条件不能放在危险运算后面
如果改成12 / x > 2 && x != 0,求值首先遇到12/x。x=0时,尚未检查右侧保护条件,就已经尝试整数除零,不能靠后面的判断补救。
因此两个条件在普通布尔代数中看起来可以交换,并不表示带有可能失败运算的程序表达式也可随意换序。读代码时应把求值过程写出来,而不是只在纸上整理逻辑符号。
或运算的短路条件不同
对x == 0 || 12 / x > 2,当x=0时左侧为true,整个或表达式已为true,右侧同样不执行。当左侧为false时,才需要继续计算右侧,决定结果。
所以&&在左侧为false时短路,||在左侧为true时短路。它们都先求左侧,但停止的条件不同,不能把一种运算符的规则套到另一种上。
区分逻辑相似与执行相同
Java的布尔&与|会求值两边,不具有这里相同的跳过规则。因此不能把&&改写成单个&,却仍期待x=0时右侧不会除零。这里只讨论明确为int和boolean的原创片段,不涉及其他输入副作用。
本例是一般Java学习训练,不是AP官方试题。当前课程范围请核对College Board资料,语言细节可查Java规范。咨询时可把每一步是否执行列出来,再说明错误发生在算术、比较还是条件顺序。
延伸阅读:AP计算机科学A循环:小于和小于等于,为什么会多执行一次。
带着具体问题,扫码联系翰林
正在了解项目、选择学习方向,或已经开始准备?用微信扫描下方二维码,发送“AP短路1101”。请补充年级、所在地区、当前基础和最想解决的问题,方便沟通时直接聚焦。

电脑阅读可用微信扫码;手机阅读可点击入口,或保存二维码后在微信内识别。
