gpt4 book ai didi

java - 为什么我应该总是使用 ||而不是 |和 && 而不是 &?

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:02 25 4
gpt4 key购买 nike

自从我开始编程 Java 以来,我注意到每个人都在使用 &&|| 而不是 &| 。这是什么原因?我一直在使用 &&|| 因为我不知道你可以使用 &|。

class A{static{
boolean t = true;
boolean f = false;
System.out.println("&ff " + (f&&f) + " " + (f&f));
System.out.println("&ft " + (f&&t) + " " + (f&t));
System.out.println("&tf " + (t&&f) + " " + (t&f));
System.out.println("&tt " + (t&&t) + " " + (t&t));
System.out.println("|ff " + (f||f) + " " + (f|f));
System.out.println("|ft " + (f||t) + " " + (f|t));
System.out.println("|tf " + (t||f) + " " + (t|f));
System.out.println("|tt " + (t||t) + " " + (t|t));
}}

据我所知,它们是相同的:

$ javac A.java && java A
&ff false false
&ft false false
&tf false false
&tt true true
|ff false false
|ft true true
|tf true true
|tt true true
Exception in thread "main" java.lang.NoSuchMethodError: main

使用 ||&& 是否以任何方式改进我的代码?


作为一个简单的测试,我用缩写形式替换了数百次,我的所有单元测试仍然通过。

最佳答案

||&& 使用 short circuit evaluation

来自 same article

Short-circuit evaluation, minimal evaluation, or McCarthy evaluation denotes the semantics of some Boolean operators in some programming languages in which the second argument is only executed or evaluated if the first argument does not suffice to determine the value of the expression

假设您有一个对象,如果您这样做,您想要检查其属性之一的某个值:

if(obj != null & obj.ID == 1)

如果您的对象 obj 为空,您将得到一个空引用异常,因为您使用了单个 &,第一个条件评估为 false ,但它仍会继续下一个条件并引发空引用异常。

如果您使用 && 那么第二个条件将永远不会被评估,因此也不异常(exception)。

if(obj != null && obj.ID == 1)

对于您的代码,您不会看到任何差异,但是在多个条件下使用按位 |& 根本不会导致短路。

更多解释。


假设您遵循以下代码:

Boolean conditionA = 2 > 1; //some condition which returns true
if(conditionA | obj.SomeTimeConsumingMethod()){

}

现在在上面的代码片段中,假设您有一个带有方法 SomeTimeConsumingMethod 的对象,该方法在处理过程中花费大量时间并返回 truefalse。如果您使用单个 | 它会评估两个条件,因为第一个 conditionAtrue 它会处理 obj.SomeTimeConsumingMethod 同样。由于使用了 | (OR),整个 if 语句的最终结果将为 true

如果您的条件使用双 || (或逻辑运算符)

if(conditionA || obj.SomeTimeConsumingMethod())

那么第二个条件 obj.SomeTimeConsumingMethod() 将不会被评估。这是短路,只是让您免于执行一些耗时的方法。无论 obj.SomeTimeConsumingMethod() 返回什么,最终结果仍然是 true

关于java - 为什么我应该总是使用 ||而不是 |和 && 而不是 &?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com