逻辑运算符OR无短路

时间:2014-09-26 01:59:14

标签: java

您何时需要使用非短路逻辑运算符或?换句话说......

你什么时候使用

if(x == 1 | x==2)

而不是

if(x == 1 || x==2)

如果第一个条件为真......则整个语句已经为真。

更新:和&同样的问题和&&

4 个答案:

答案 0 :(得分:8)

如果我们有两个函数并且我们希望它们都被执行,那么就会出现一个例子:

if (foo() | bar())

如果我们使用了||,那么bar()如果foo()返回true则不会执行||,这可能不是我们想要的。

(虽然这有点模糊不清,但& 更常适合。

&& / if (foo() & bar())

可能出现类似情况
&&

如果我们使用了bar(),那么foo()如果{{1}}返回false则不会执行{{1}},这可能不是我们想要的。

答案 1 :(得分:4)

嗯,有几个原因。请看以下示例:

if(someImportantMethod() | otherImportantMethod())
{
    doSomething();
}

如果您需要同时运行这两种方法,无论其他方法的结果如何,那么您必须使用|代替||

需要注意的是,短路操作数稍微慢一点(尽管性能影响通常是不可察觉的)。

答案 2 :(得分:2)

根据你的问题,

如果您使用“|”运算符如“if(x == 1 | x == 2)”,两个表达式都被计算,如果至少有一个TRUE值,则运行if块的主体

如果您使用“||”运算符如“if(x == 1 || x == 2)”,第一个表达式被计算,如果它返回TRUE则不会评估第二个表达式并运行if块的主体

如果您使用“&”运算符如“if(x == 1& x == 2)”,两个表达式都被计算,如果两个表达式都返回TRUE值,则运行if块的主体

如果您使用“&&”运算符如“if(x == 1&& x == 2)”,第一个表达式被计算,如果它返回FALSE则不会评估第二个表达式并且不要运行if块的主体

此外,“||”和“&&”可用于节省应用程序的操作时间

答案 3 :(得分:1)

我曾经问过Josh Bloch这个问题,他给出了另一个可能的理由,IIRC:表现。非短路版本没有分支。如果第二个操作数非常便宜并且第一个操作数几乎总是为真,则可以更快地避免第二个操作数的条件评估,并让处理器执行它而无需等待。