2017-09-06 77 views
1

我不知道下面的代码如何返回false。Java逻辑短路运算符如何工作

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

我知道,如果我们使用& &是,执行从左侧开始和它进行唯一如果离开结果为真,否则不要继续。

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

帮我理解这个操作符。

谢谢。

回答

3

您有两个操作员。 AND运算符首先被评估并返回false。然后,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 
+0

谢谢你的时间。我所说的是,如果**** line.length()> 0 ****失败,为什么它会验证其他事情。它应该短路吗?它不应该验证其他条件,它应该通过if测试。纠正我,如果我错了。 – Abdul

+0

@Abdul它确实短路,这就是为什么'!line.startsWith(“/ *”)'永远不会被评估的原因,然而'' !line.startsWith(“ - ”)不是AND运算符的操作数的一部分,因此在AND运算符评估为false之后,OR将被评估 - '(false ||!line.startsWith(“ - “ - ”)' - returned true。 – Eran

+0

谢谢,在添加括号后,我明白了。 – Abdul

0

如果向代码中添加括号,它将更清晰,例如,

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

第一操作者&&而第二运营商||被评估为真进行评估,以括号内假。

+0

我知道,我对Java Short电路运算符感到困惑。 – Abdul

+0

@Abdul这里没有短路。 。左边的运算符将返回'false'或'true',并将该值与'||'的右边进行比较。如果你想短路它,你必须在声明中使用括号 –

0

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

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

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

也就是在括号中的电源炫耀!