【问题标题】:How Java Logical short circuit Operators WorkJava 逻辑短路运算符的工作原理
【发布时间】:2017-09-06 10:27:18
【问题描述】:

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

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

我所知道的是,如果我们使用 &&,则从左边开始执行,只有当左边的结果为真时才会继续执行,否则不会继续执行。

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

帮助我理解这个运算符。

谢谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    您有两个运算符。 AND 运算符首先计算并返回false。然后计算 OR 运算符并返回 true,因为 OR 运算符的第二个操作数为真:

    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
    

    【讨论】:

    • 感谢您的宝贵时间。我要说的是如果 ****line.length()>0**** 失败了,为什么它会验证其他东西。应该是短路了吧?它不应该验证其他条件,并且应该通过 if 测试。如果我错了,请纠正我。
    • @Abdul 它确实短路了,这就是为什么 !line.startsWith("/*") 永远不会被评估,但是,|| !line.startsWith("--") 不是 AND 运算符的操作数的一部分,所以在 AND 运算符被评估为假,OR 被评估 - (false || !line.startsWith("--") - 返回真。
    • 谢谢,加上括号部分,我明白了。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我知道,我对 Java 短路运算符感到困惑。
      • @Abdul 你这里没有短路。有两个不同的操作员在工作。左运算符将返回falsetrue,并将该值与|| 的右侧进行比较。如果你想短路它,你必须在语句周围使用括号
      【解决方案4】:

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

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

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

      这就是括号的威力大显身手的地方!

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 2015-07-14
        • 2012-03-05
        • 2013-06-02
        • 2019-05-29
        • 1970-01-01
        相关资源
        最近更新 更多