Java逻辑短路运算符的工作原理

时间:2017-09-06 10:27:18

标签: java

我想知道以下代码如何返回false。

String line ="";
if (line.length() > 0 && !line.startsWith("/*") || !line.startsWith("--")) {    
  return false;
}

我所知道的是,如果我们使用&&amp ;,执行从左侧开始,只有当左侧结果为真时才会继续执行,否则它不会继续执行。

但在上面的代码中它返回false。 line.length()的值为0,但是它的验证第二个条件并且评估为true,因为其他两个条件为真并返回false。

帮助我理解这个操作符。

谢谢。

4 个答案:

答案 0 :(得分:3)

你有两个运营商。首先评估AND运算符并返回false。然后评估OR运算符并返回true,因为OR运算符的第二个操作数为true:

if (line.length() > 0 && !line.startsWith("/*") || !line.startsWith("--"))
          false       &&      not evaluated
                     false                      ||         true
                                               true    

如果希望AND运算符的第二个操作数包含OR运算符,则应添加括号:

if (line.length() > 0 && (!line.startsWith("/*") || !line.startsWith("--")))
        false                             not evaluated
                     false

答案 1 :(得分:0)

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

查看条件运算符部分。它清楚地说明了:第二个条件只在需要时进行评估。由于没有括号为您的条件提供任何层次结构,因此它会评估第一个。长度不大于0,因此它返回false并且它不会评估其他2。

答案 2 :(得分:0)

如果在代码中添加括号,则会更清晰,例如。

if ( (line.length() > 0 && !line.startsWith("/*") ) || !line.startsWith("--"))

第一个运算符&&在括号内被评估为false,而第二个运算符||被评估为true。

答案 3 :(得分:0)

首先,line.length() > 0 && !line.startsWith("/*")false。然后,评估继续false || !line.startsWith("--") true。这就是为什么执行if语句块中的代码的原因。

根据我的推断,我认为你真正需要的是:

if (line.length() > 0 && (!line.startsWith("/*") || !line.startsWith("--")))

括号的力量显示出来了!