繁体   English   中英

&& 运算符之间的条件排序是否存在差异?

[英]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,如果任何条件失败,我们将停止检查所有其他条件。

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

更多关于短路评估的阅读

https://en.m.wikipedia.org/wiki/Short-circuit_evaluation

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

在数学或 boolean 代数或其他任何东西中,AND 运算符具有关联和交换属性,所以在数学方面,没有。

但是,大多数编程语言都对其 Boolean 和运算符使用惰性求值。 如果第一个操作数是false并且运算符是&& ,那么如果您知道第二个操作数只会返回 false,为什么还要评估它呢?

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

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

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

  1. 必须在工作条件之前检查(例如不是 null 条件)。
  2. 低时间复杂度条件(例如检查变量的值)。
  3. 高时间复杂度条件(例如在数组中搜索/排序)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM