Java中&&优先级高于||?解析短路求值致变量未自增问题
Java逻辑运算符优先级与短路求值的代码解析
我原本认为Java中逻辑与(&&)的优先级高于逻辑或(||),比如boolean b = boolExp1 || boolExp2 && boolExp3等价于boolean b = boolExp1 || (boolExp2 && boolExp3)。但测试下面的代码时,初始值为1的int变量x在执行布尔表达式后完全没变化,和我预期的x=4不符,想搞清楚是不是短路求值导致的,需要详细解析这段代码的执行过程。
测试代码
public class Main { public static void main(String[] args) { int x = 1; boolean b = (1<2) || (6<x++) || (++x>9) && (true^false) ^ (x++<7); System.out.println(b); System.out.println("x = "+ x); } }
实际输出
true x = 1
预期输出
true x = 4
代码执行过程解析
你的优先级理解是对的:&&的优先级确实高于||,但这里的核心问题是短路逻辑或||的特性——只要||左侧的表达式结果为true,右侧的所有表达式都会直接被跳过,不会执行。
我们一步步拆解执行流程:
- 首先执行最左侧的
(1<2),结果为true。 - 由于是
||运算符,当第一个操作数已经是true时,整个||表达式的结果已经确定为true,所以后面的所有表达式:(6<x++)- 以及优先级更高的
(++x>9) && (true^false) ^ (x++<7)整个部分
都不会被执行。
- 变量
x完全没有被任何自增操作修改,始终保持初始值1,布尔变量b直接被赋值为true。
你预期x=4是假设所有涉及x的表达式都被执行了,但短路求值直接跳过了这些步骤,这就是实际结果和预期不符的根本原因。
内容的提问来源于stack exchange,提问作者Yazan AlAtout
相关产品推荐
相关产品推荐

