[英]Is there a difference in ordering of conditions between the && operator?
我是 java 的新手,正在练习一些 leetcode: https://leetcode.com/problems/same-tree/
我对这个问题的解决方案是:
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null){
return true;
}
return (p.val == q.val)&&(p != null && q != null)&&
isSameTree(p.left, q.left)&&
isSameTree(p.right, q.right);
}
}
我只是无法让它与它一起工作,导致空指针错误。 但随后只是条件的切换:
return (p != null && q != null)&&(p.val == q.val)&&
isSameTree(p.left, q.left)&&
isSameTree(p.right, q.right);
突然之间它起作用了。 不知道为什么。 我认为 && 是一个逻辑与运算符,所以 A 和 B 与 B 和 A 相同......这是怎么回事?
为了 && 运算符检索真,所有条件都需要返回真,所以我们首先检查左边的条件,只有当它为真时,我们才会一一检查所有 rest,如果任何条件失败,我们将停止检查所有其他条件。
因此,在您的情况下,您需要首先获得所有低复杂度的操作
更多关于短路评估的阅读
在大多数编程语言中,表达式是从左到右计算的。 在您之前的方法中,当p
为 null 时, p.val
可能会导致 NullPointerException。 为避免这种情况,您应始终在 AND/OR 表达式之前检查 null 条件。 这正是你所做的(没有意识到我猜。)。
在数学或 boolean 代数或其他任何东西中,AND 运算符具有关联和交换属性,所以在数学方面,没有。
但是,大多数编程语言都对其 Boolean 和运算符使用惰性求值。 如果第一个操作数是false
并且运算符是&&
,那么如果您知道第二个操作数只会返回 false,为什么还要评估它呢?
使用它,您可以通过更改操作数的顺序来避免错误(例如您发布的错误)。
例如,如果您想在尝试访问对象的成员时避免object is undefined
错误,您可以执行if(object.= undefined && object.isExample)
。 如果object
未定义,则它知道该表达式为假并退出。
&& 运算符代表逻辑中的“和”,仅当两个条件都为真时才返回真。 因此,首先检查左侧条件,如果为假,则不检查右侧条件。 因此,我建议您按此顺序放置条件(此顺序中较高的应该是左侧条件):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.