为什么下述布尔表达式在Java等编程语言中运行结果为false?
问题原因分析
这个结果和短路求值无关,核心是你搞错了运算符的优先级:Java 中==运算符的优先级远高于逻辑与&&,实际运算顺序和你预想的完全不同。
你预想的运算顺序
你默认逻辑与的优先级更高,认为表达式会先分别计算==左右两侧的所有逻辑运算,再做相等判断,等效于加了如下括号:
boolean result = ( (a && (b || !a)) ) == ( a && b );
代入a=false, b=false的取值:
- 左侧
a && (b || !a)=false && (false || true)=false - 右侧
a && b=false && false=false - 最终
false == false得到true,这是你预期的结果。
实际的运算顺序
受运算符优先级规则约束,==会比&&先执行,原表达式实际等效于加了如下括号:
boolean result = ( (a && (b || !a)) == a ) && b;
代入取值分步计算:
- 先计算最内层括号
a && (b || !a):a为false,逻辑与触发短路,直接得到结果false - 再计算相等判断
false == a:a为false,得到结果true - 最后计算逻辑与
true && b:b为false,得到最终结果false,和你实际运行的输出一致。
补充说明:你在其他编程语言中测试得到相同结果,是因为绝大多数主流语言(C、C++、Python、JavaScript等)都遵循
==优先级高于&&的设计,这个现象是通用的运算符优先级规则导致的,和语言特性、短路求值都没有关系。
内容的提问来源于stack exchange,提问作者Mr. Weber
相关产品推荐
相关产品推荐

