我最近发现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发布于 2012-03-03 05:40:27
如果右边是一个有副作用的函数,而你不想执行(例如日志记录),那么它们就很有用。然而,我认为这有点代码的味道,肯定会让下一个人觉得不直观。
发布于 2012-03-03 05:44:19
嗯。我知道,如果仔细使用,它们对于优化C/C++代码非常有用。它可能也适用于Java。
除了实际的位操作之外,C中的主要用途是消除流水线停滞。短路操作员需要分支操作。按位运算符将计算两边,并消除预测错误的分支和结果停滞的可能性。
发布于 2012-03-03 05:49:03
使用非短路布尔运算符意味着操作数有副作用。如果它们没有副作用,那么程序员可以在不改变功能的情况下使用短路版本。
在以函数式风格编写的代码中( Scala肯定鼓励这样做,但并不要求这样做),副作用表明正在发生一些不寻常的事情。不寻常的事情应该在代码中清楚地表示出来,而不是像非短路布尔运算符这样微妙的东西。
https://stackoverflow.com/questions/9540718
复制相似问题