繁体   English   中英

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

[英]How Java Logical short circuit Operators Work

我想知道下面的代码如何返回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

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

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

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

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

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

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

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

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

这就是括号的力量炫耀!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM