逻辑运算符或无短路

逻辑运算符或无短路

问题描述:

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

什么时候使用

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

而不是

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

如果第一个条件是真的......那么整个语句已经成为事实。

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

+0

你想知道这个“布尔类型”?对于整型类型,逻辑或运算符本身非常有用,但短路运算不是一种替代方案,因为它不能对整型进行操作。 – 2014-09-26 02:04:13

+0

在这里看到答案:http://stackoverflow.com/questions/9264897/reason-for-the-exsistance-of-non-short-circuit-logical-operators – Halogen 2014-09-26 02:22:27

一个例子出现,如果我们有两个功能,我们希望他们既要执行:

if (foo() | bar()) 

如果我们使用||,然后如果foo()返回true,则bar()将不会执行,这可能不是我们想要的。 (虽然这是有些晦涩案件,并且往往不是||的更合适的选择)

类似的情况可以想出&/&&

if (foo() & bar()) 

如果我们使用了&&,那么bar()将不会执行,如果foo()返回false,这再次可能不是我们想要的。

+0

也当你有if(x == 1 | x ++ > 2)... – 2014-09-26 02:03:52

+0

@shinjw更新回答。 – arshajii 2014-09-26 02:05:35

好吧,有几个原因。看看下面的例子:

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

如果您需要这两种方法来运行,不管其他方法的结果,那么你不得不使用|而不是||

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

根据你的问题,

如果你使用“|”运算符如“if(x == 1 | x == 2)”,对两个表达式进行求值并且如果至少有一个TRUE值,则运行if块的主体

如果使用“||”如果“if(x == 1 || x == 2)”,第一个表达式被评估,并且如果它返回TRUE,则不会评估第二个表达式并运行if块的主体,如果使用“&”操作符,如“如果(X == 1 & X == 2)”,既表达式进行求值,并且如果两个表达式都返回TRUE值,则运行的,如果块

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

此外,“||”和“& &”可以用来节省您的应用程序的运行时间

我问Josh Bloch自己这个问题一次,他给了另一个可能的原因,IIRC:表现。非短路版本没有分支。如果第二个操作数非常便宜,第一个操作数几乎总是真的,那么避免对第二个操作数进行条件评估可能会更快,并且让处理器无需等待即可执行。