您何时需要使用非短路逻辑运算符或?换句话说......
你什么时候使用
if(x == 1 | x==2)
而不是
if(x == 1 || x==2)
如果第一个条件为真......则整个语句已经为真。
更新:和&同样的问题和&&
答案 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:表现。非短路版本没有分支。如果第二个操作数非常便宜并且第一个操作数几乎总是为真,则可以更快地避免第二个操作数的条件评估,并让处理器执行它而无需等待。