逻辑运算符或无短路
什么时候您需要使用非短路逻辑运算符或?换句话说...逻辑运算符或无短路
什么时候使用
if(x == 1 | x==2)
而不是
if(x == 1 || x==2)
如果第一个条件是真的......那么整个语句已经成为事实。
更新:和&同样的问题,& &
一个例子出现,如果我们有两个功能,我们希望他们既要执行:
if (foo() | bar())
如果我们使用||
,然后如果foo()
返回true,则bar()
将不会执行,这可能不是我们想要的。 (虽然这是有些晦涩案件,并且往往不是||
是的更合适的选择)
类似的情况可以想出&
/&&
:
if (foo() & bar())
如果我们使用了&&
,那么bar()
将不会执行,如果foo()
返回false,这再次可能不是我们想要的。
也当你有if(x == 1 | x ++ > 2)... – 2014-09-26 02:03:52
@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:表现。非短路版本没有分支。如果第二个操作数非常便宜,第一个操作数几乎总是真的,那么避免对第二个操作数进行条件评估可能会更快,并且让处理器无需等待即可执行。
你想知道这个“布尔类型”?对于整型类型,逻辑或运算符本身非常有用,但短路运算不是一种替代方案,因为它不能对整型进行操作。 – 2014-09-26 02:04:13
在这里看到答案:http://stackoverflow.com/questions/9264897/reason-for-the-exsistance-of-non-short-circuit-logical-operators – Halogen 2014-09-26 02:22:27