Java &;之间的条件排序是否有差异&;操作人员

Java &;之间的条件排序是否有差异&;操作人员,java,conditional-statements,Java,Conditional Statements,我是java的新手,在这里练习了一些leetcode: 我对这个问题的解决办法是: class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null){ return true; } return (p.val == q.val)&&(p != null &&

我是java的新手,在这里练习了一些leetcode:

我对这个问题的解决办法是:

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);

突然之间,它起了作用。不知道为什么。我认为&&是一个逻辑and运算符,所以a和B与B和a是一样的。。。发生了什么事?

为了使&&operator检索到true,所有条件都需要返回true,因此我们首先检查左侧条件,只有当其为true时,我们才逐个检查其余条件, 如果任何条件失败,我们将停止检查所有其他条件

因此,在您的情况下,您需要首先获得所有低复杂度的操作

更多关于短路评估的阅读


为了&&operator检索true,所有条件都需要返回true,因此我们首先检查左侧条件,只有当其为true时,我们才逐个检查其余条件, 如果任何条件失败,我们将停止检查所有其他条件

因此,在您的情况下,您需要首先获得所有低复杂度的操作

更多关于短路评估的阅读


在大多数编程语言中,表达式是从左到右求值的。在前面的方法中,
p.val
p
为null时可能会导致NullPointerException。为了避免这种情况,您应该在和/或表达式中始终检查空条件。这正是您所做的(我猜您没有意识到。)

在大多数编程语言中,表达式是从左到右求值的。在前面的方法中,
p.val
p
为null时可能会导致NullPointerException。为了避免这种情况,您应该在和/或表达式中始终检查空条件。这正是你所做的(我猜是没有意识到的)。

在数学或布尔代数或其他方面,AND运算符具有联想和交换属性,所以在数学方面,不是

然而,大多数编程语言对布尔and运算符使用延迟求值。如果第一个操作数是
false
,而运算符是
&&
,那么如果知道第二个操作数将返回false,为什么还要费心计算它呢

使用它,您可以通过更改操作数的顺序来避免错误(如您发布的错误)


例如,如果您想避免在尝试访问对象的成员时出现
对象未定义
错误,您可以在(object!=undefined&&object.isExample)时执行
操作。如果对象未定义,则它知道该表达式为false,并退出该表达式。

在数学或布尔代数中,and运算符具有关联性和交换性,因此在数学方面,不会

然而,大多数编程语言对布尔and运算符使用延迟求值。如果第一个操作数是
false
,而运算符是
&&
,那么如果知道第二个操作数将返回false,为什么还要费心计算它呢

使用它,您可以通过更改操作数的顺序来避免错误(如您发布的错误)


例如,如果您想避免在尝试访问对象的成员时出现
对象未定义
错误,您可以在(object!=undefined&&object.isExample)
时执行
操作。如果
对象
未定义,则它知道该表达式为false并退出该表达式。

在逻辑中&&运算符代表“and”,仅当两个条件都为true时才返回true。 因此,首先检查左侧条件,如果为false,则不检查右侧条件。 因此,我建议您按此顺序放置条件(此顺序中的较高者应为左侧条件):

  • 必须在工作条件(例如非空条件)之前进行检查
  • 低时间复杂度条件(例如检查变量的值)
  • 高时间复杂度条件(例如在数组中搜索/排序)

  • &&运算符在逻辑中代表“and”,只有当两个条件都为true时,才会返回true。 因此,首先检查左侧条件,如果为false,则不检查右侧条件。 因此,我建议您按此顺序放置条件(此顺序中的较高者应为左侧条件):

  • 必须在工作条件(例如非空条件)之前进行检查
  • 低时间复杂度条件(例如检查变量的值)
  • 高时间复杂度条件(例如在数组中搜索/排序)

  • 首先检查左侧条件。这种行为称为短路评估。首先检查左侧条件。这种行为称为短路评估。