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

Java逻辑短路运算符的工作原理,java,Java,我想知道下面的代码如何返回false String line =""; if (line.length() > 0 && !line.startsWith("/*") || !line.startsWith("--")) { return false; } 我所知道的是,如果我们使用&,执行从左边开始,只有当左边的结果为真时,它才会继续,否则它不会继续 但是在上面的代码中,它返回false。line.length()的值为0,但它验证第二个条件并计算为true

我想知道下面的代码如何返回false

String line ="";
if (line.length() > 0 && !line.startsWith("/*") || !line.startsWith("--")) {    
  return false;
}
我所知道的是,如果我们使用&,执行从左边开始,只有当左边的结果为真时,它才会继续,否则它不会继续

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

帮助我理解这个操作符


谢谢。

您有两个操作员。首先计算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


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

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

if ( (line.length() > 0 && !line.startsWith("/*") ) || !line.startsWith("--"))
第一个运算符
&
在括号内计算为false,而第二个运算符
|
计算为true。

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

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

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

这就是圆括号的力量所显示出来的

谢谢你抽出时间。我要说的是,如果****line.length()>0****失败了,为什么它要验证其他东西。它应该短路,对吗?Its不应验证其他条件,且应通过if测试。如果我错了,请纠正我。@Abdul它确实短路了,这就是为什么
!line.startsWith(“/*”)
永远不会被计算,但是,
||!line.startsWith(“--”)不是AND运算符的操作数的一部分,因此在AND运算符求值为false后,OR求值为-
(false | |!line.startsWith(“--”)
-返回true。谢谢,在添加了括号部分后,我理解了。我知道,我对Java短路运算符感到困惑。@Abdul您不是在这里短路。有两个不同的运算符在工作。左侧运算符将返回
false
true
,并将该值与的右侧进行比较ode>| |
。如果要短路,必须在语句周围使用括号