Java / Scala中的非短路逻辑(布尔)运算符有很好的用途吗?

我最近发现Java(和Scala)包括非短路逻辑运算符&| ,和^ 。 我以前认为这些只能作为按位运算符。 虽然可能存在^的争论,但我无法想到使用非短路逻辑运算符的非常好的理由 – 尽管可以肯定,我可以设想一个例子。

这些运营商有用吗? 它们似乎更容易导致难以捕获的错误。

 scala> def foo = { | println("foo") | true | } foo: Boolean scala> def bar = { | println("bar") | true | } bar: Boolean scala> foo || bar foo res5: Boolean = true scala> foo | bar foo bar res6: Boolean = true 

如果右侧是具有您想要执行的副作用的函数(例如,日志记录),它们将非常有用。 但是,我建议这有点代码味道,对下一个人来说肯定是不直观的。

嗯。 我知道如果仔细使用它们对于优化C / C ++代码非常有用。 它也可能适用于Java。

C中的主要用途 – 除了实际的位操作 – 是删除管道停顿。 短路操作器需要分支操作。 按位运算符将计算双方并消除错误预测分支和结果失速的机会。

使用非短路布尔运算符意味着操作数具有副作用。 如果它们没有副作用,那么程序员可以使用短路版本而不改变function。

在以函数式编写的代码中(Scala肯定鼓励但不要求),副作用表明正在发生一些不寻常的事情。 应该在代码中清楚地指出不寻常的东西,而不是像非短路布尔运算符那样微妙的东西。

如果您正在尝试跟踪某些内容的答案或输入,这取决于非短路布尔运行的两侧。

举个例子,假设你有:

 if(methodA() & methodB()){ //some code } 

在methodB()方法中,一些基本代码正在运行。 如果那是短路代码(&&)并且methodA()为false,则methodB()将永远不会运行。

至少,这是我能想到的用途之一。