LeetCode112题Java代码中括号为何影响三目运算执行结果
括号导致执行逻辑差异的核心原因
本质是Java运算符优先级规则导致的:Java中逻辑或运算符||的优先级高于三目运算符?:,不加括号时编译器不会按照预想逻辑拆分表达式,会按照优先级默认组合运算顺序。
两种写法的执行逻辑对比
1. 加括号的正确版本(可通过所有测试用例的写法)
代码片段:
return (root.left == null? false : helper(root.left, sum - root.val)) || root.right == null? false : helper(root.right, sum - root.val);
括号优先级最高,执行顺序完全符合路径判断的预期:
- 第一步:先计算括号内左子树的三目判断,得到左子树递归结果
leftRes - 第二步:如果
leftRes为true,||触发短路逻辑,直接返回true - 第三步:如果
leftRes为false,再计算右子树的三目判断结果并返回
整体逻辑是左子树存在符合要求的路径,或者右子树存在符合要求的路径,就返回true,和题目要求一致。
2. 去掉括号的错误版本
去掉第一个三目外层的括号后,代码实际等价于:
return ( (root.left == null? false : helper(root.left, sum - root.val)) || root.right == null ) ? false : helper(root.right, sum - root.val);
因为||优先级更高,编译器会先把||左右两边的内容绑定成三目运算符的判断条件,执行逻辑完全错乱:
- 第一步:先计算
左子树递归结果 || root.right == null得到条件值cond - 第二步:如果
cond为true,整个表达式直接返回false - 第三步:只有
cond为false时,才会递归调用右子树的判断逻辑返回结果
最典型的错误场景:当前节点左子树递归已经找到符合要求的路径(返回true),此时true || 任意值的结果都是true,也就是cond = true,整个表达式直接返回false——本来应该返回正确结果的场景直接返回了错误值,自然无法通过测试用例。
内容的提问来源于stack exchange,提问作者BettyQ
相关产品推荐
相关产品推荐

