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