我想知道以下代码如何返回false。
String line ="";
if (line.length() > 0 && !line.startsWith("/*") || !line.startsWith("--")) {
return false;
}
我所知道的是,如果我们使用&&amp ;,执行从左侧开始,只有当左侧结果为真时才会继续执行,否则它不会继续执行。
但在上面的代码中它返回false。 line.length()
的值为0,但是它的验证第二个条件并且评估为true,因为其他两个条件为真并返回false。
帮助我理解这个操作符。
谢谢。
答案 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("--")))
括号的力量显示出来了!