Java逻辑运算符(&&,||)短路机制

时间:2015-05-04 14:44:15

标签: java logical-operators short-circuiting

在我阅读同事的Java代码时,我偶然发现了一大堆if / else语句。在这些陈述中,几个&&||运算符在没有括号任何帮助的情况下相互争斗。我将这些陈述简化为:

if (true || true && false)
  return true;
else
  return false;

您认为结果如何?老实说,我认为这将是false,但似乎短路并不像我预期的那样有效。在这种情况下,结果为true。当短路机制发现true紧跟true后,它似乎将整个表达式视为||

但在反向表达中,结果是什么?

if (false && true || true)
  return true;
else
  return false;

如果我们遵循相同的逻辑,它应该是错误的。第一个布尔值为false,紧随其后的是&&,但结果再次为true。这对我来说很有意义,但它似乎与我们之前的实验不相容。

所以这是我的理论:

如果我们找到true后跟||,那么它就是true,无论接下来会发生什么,即使后面还有很长的其他逻辑运算符列表。但是如果我们找到false后跟&&,它只会使下一个元素短路,而不是整个语句。

这是我的问题:

我是对的吗?这对我来说似乎有点傻。 true强于false吗?

6 个答案:

答案 0 :(得分:58)

这只是因为

if (false && true || true)

相当于(&&有更高的precedence

if ((false && true) || true)

if (false || true)

是...... true

注意:在表达式true || true && false中,部分true && false被称为死代码,因为它不会影响评估的最终结果,因为{{1总是true || anything

值得一提的是,有true&运算符可以应用于布尔值,它们很像|&&,除非他们不短路,意味着如果你有以下表达式:

||

if (someMethod() & anotherMethod()) 返回someMethod,仍然会到达false!但anotherMethod将不会被执行,因为最终结果将被评估为if

答案 1 :(得分:15)

&&的操作优先级高于||,因此获胜。

答案 2 :(得分:8)

根据Java tutorials &&优先于||

因此,您的true || true && false将被评估为true || (true && false)

您的false && true || true将被评估为(false && true) || true

两种情况都导致true的输出。

答案 3 :(得分:5)

代表&&

  

false&& ... =>假

代表||

  

true || ... =>真。

&&的优先级高于||

查看更多:Operator Precedence in Java

答案 4 :(得分:3)

由于&& ||优先(true || true && false)(true || (true && false)) -> (true || (false)) -> true这将被评估为RatingBar ratingBar = (RatingBar) findViewById(R.ir.yourRatingBarId); switch (ratingBar.getRating()) { case "the value you need": do something break; case "another value": do something else break; }

请参阅优先规则:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

答案 5 :(得分:1)

I see what you were trying to do, but before operating on parentheses it's good to have the language's specification handy. I've known a few programmers who have gone so far as to keep the important bits, like operator precedence, on their walls.

The second part is to know whether your alterations are going to make any sense to the other people in your workplace; if removing parentheses compromises the meaning of an operation to someone else working on the code, then it could ultimately be detrimental.

The optimizer will generally take care of it for you, so when in doubt, leave them in there.