在 Java 的 if 块中使用逻辑运算符或按位运算符有区别吗?

Posted

技术标签:

【中文标题】在 Java 的 if 块中使用逻辑运算符或按位运算符有区别吗?【英文标题】:Is there a difference between using a logical operator or a bitwise operator in an if block in Java? 【发布时间】:2012-06-24 18:31:10 【问题描述】:

以下两个 if 块的内容应该被执行:

if( booleanFunction() || otherBooleanFunction() ) ...
if( booleanFunction() | otherBooleanFunction() ) ...

那么使用| 和使用|| 有什么区别呢?

注意:我对此进行了调查,并找到了自己的答案,并将其包含在下面。请随时纠正我或发表您自己的看法。肯定有改进的余地!

【问题讨论】:

我不明白这个问题的重点,你问了一个你自己回答的问题——在其他人回答之前? @Nim 和 Durandal:嗯.. 我可能错过了重点,但根据this,如果您认为可能与其他人相关,回答您自己的问题实际上是可以的。我解决了自己的问题,并认为我会分享,所以我不厌其烦地在这里记录它。没有冒犯任何人的意思 @Miquel,这与冒犯无关,IMO 是您立即回答了这个问题,这表明您正试图向愤世嫉俗者(例如我自己!:))提供声誉下次很少时间,看看社区产生了什么,如果你没有找到合适的答案,贡献 - 然后它会删除任何这样的外观...... @Nim 好吧,点了。显然这被误解了,所以我会按照你的建议做,同时,我会将讨论转移到元。也许我们不应该在框下方直接“回答您自己的问题”来发布问题。 我看不出有什么大不了的。也许米克尔没有整天等着完成他想要完成的事情。如果我处于那种情况并且已经对我的问题有足够的解决方案,我不会只是等待出现。 【参考方案1】:
if( booleanFunction() || otherBooleanFunction() ) ...

在这种情况下,如果booleanFunction() 返回true,那么otherBooleanFunction() 将不会被执行。

if( booleanFunction() | otherBooleanFunction() ) ...

但在按位运算符中,无论booleanFunction() 返回true 还是falsebooleanFunction()otherBooleanFunction() 都会执行两个函数

【讨论】:

【参考方案2】:

按位和逻辑运算符之间的区别- 1.按位运算符适用于位,而逻辑运算符适用于语句。 2. 按位与由 & 表示,而逻辑与由 && 表示。 3. 按位或由 | 表示而逻辑或由 || 表示。

【讨论】:

【参考方案3】:

两者有不同的用途。尽管在许多情况下(处理布尔值时)它们可能看起来具有相同的效果,但重要的是要注意逻辑或是短路的,这意味着如果它的第一个参数的计算结果为真,那么第二个参数就剩下了未评估。位运算符会计算它的两个参数。

类似地,逻辑与是短路的,这意味着如果它的第一个参数的计算结果为假,那么第二个参数就不会被计算。同样,按位与不是。

您可以在此处查看此操作:

int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 |  y/x == 1);

第一个 print 语句工作正常并返回 true,因为第一个参数的计算结果为 true,因此计算停止。第二个打印语句出错,因为它不是短路,并且遇到被零除。

【讨论】:

【参考方案4】:

对于程序员来说,只有一个区别。

    您的逻辑运算符是逻辑运算符,即他们只测试一个条件并根据该条件获得结果。

布尔函数() ||如果任一为真,otherBooleanFunction() 将为真。同样,booleanFunction() && otherBooleanFunction() 如果其中一个为假,则为假。那么,为什么要测试另一个。这就是逻辑运算符的作用。

但按位检查两者。这个概念的常见应用如下。

if(someObject != null && someObject.somemethod())

因此,在这种情况下,如果您将 && 替换为 &,则等待灾难发生。你很快就会得到讨厌的 NullPointerException...

【讨论】:

【参考方案5】:

逻辑运算符适用于布尔值,而位运算符适用于位。在这种情况下,效果将是相同的,但有两个不同之处:

    按位运算符不是为此而设计的,这使得它更难阅读,但最重要的是 逻辑 OR 运算符将评估第一个条件。如果为真,不管下一个条件的结果是什么,结果都会为真,所以第二个子句不被执行

这里有一些方便的代码来证明这一点:

public class OperatorTest 

    public static void main(String[] args)
        System.out.println("Logical Operator:");
        if(sayAndReturn(true, "first") || sayAndReturn(true, "second"))
            //doNothing
        

        System.out.println("Bitwise Operator:");
        if(sayAndReturn(true, "first") | sayAndReturn(true, "second"))
            //doNothing
        
    

    public static boolean sayAndReturn(boolean ret, String msg)
        System.out.println(msg);
        return ret;
    

【讨论】:

那么 if 语句中的 & 运算符有实际用途吗? 使用它的唯一一点是将两个子句作为副作用执行,我认为这是一个非常糟糕的主意,因为您可能不应该依赖于副作用如果放在首位,很容易被误读

以上是关于在 Java 的 if 块中使用逻辑运算符或按位运算符有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

C# 逻辑位运符及运算原理 按位操作二进制

C# 逻辑位运符及运算原理 按位操作二进制

delphi 运算符优先级

位运算符按位与按位或按位非左移右移原码反码补码

C语言里的按位异或运算符

按位与按位或按位异或等等(& | ^ ~ >> <<)