在已知布尔结果后,Java是否计算剩余条件?

在已知布尔结果后,Java是否计算剩余条件?,java,Java,也就是说,如果我有一个计算多个条件的语句,比如像这样的'or'语句 if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely()) { ... } 如果isVeryLikely()在运行时返回true,那么isSomewhatLikely()和isHardlyLikely()会执行吗?如果不是方法,而是静态布尔值呢?和&运算符短路 true || willNeverExecute(); false && will

也就是说,如果我有一个计算多个条件的语句,比如像这样的'or'语句

if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
{
    ...
}

如果
isVeryLikely()
在运行时返回true,那么
isSomewhatLikely()
isHardlyLikely()
会执行吗?如果不是方法,而是静态布尔值呢?

&
运算符短路

true || willNeverExecute();
false && willNeverExecute();

不,java使用
|
&&
对表达式进行短路求值。有关详细信息,请参阅。

因为| |是短路的,所以语句在遇到第一个true条件时将立即求值为true,而不管操作数是否是静态的


简言之,如果第一个函数返回true,则不会对其他两个函数求值。

您需要注意的第一件事是,Java条件语句只能采用布尔值,这与其他语言(如C/C++)不同,C/C++中的任何非零值都将求值为true

也就是说,有两种类型的操作员,第一种被称为shor电路类型:

&& and ||
& and |
另一种是非短路类型:

&& and ||
& and |
对于短路类型,一旦可以找到逻辑输出作为表达式的答案,语句的其余部分将被转储。对于非短路类型,他们将继续评估所有条件

考虑到这一点,您所拥有的:

if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
{
    ...
}
Java将:

  • 首先检查isVeryLikely() 返回true。如果是真的,那么它将是真的 不要再继续了
  • 如果isVeryLikely()返回false, 然后调用isSomewhatLikely()以 看看它是否返回真值。如果是真的, 如果进行评估,则没有其他内容。如果是假的, 转到3
  • 调用IShardlyPlease()。如果 对,整个表情都是对的,, 否则为假,则为完整 表达是错误的
  • 您要问的整个概念是“Java如何计算逻辑表达式”


    希望有帮助!干杯

    简单的回答是,它将进行评估,直到有足够的证据得出是否为T/F

    有一种叫做布尔短路。本质上,它只会尝试和评估它所需要的(如果使用&&或| |运算符)和leave。您可以通过以下几种方式利用这一优势:

    (a() || b())
    
  • 如果b()会抛出异常,如果a()为true,则它甚至不会尝试检查b()。一种链式检查机构

  • 如果后面的计算占用资源,您可以将它们移动到计算的末尾(例如,b()需要花费10倍的时间)

  • 如果某个子句可以确定最可能的路径,请将它们放在第一位。这也会加快执行速度


  • 无论问题中指定的布尔表达式是静态布尔值,还是返回布尔值的方法,在这两种情况下-表达式计算将从左侧开始,条件将逐个计算。给出值true的第一个条件将使评估短路。它将直接给出结果为真,其余条件不进行评估。这就是| |(OR)在Java中使用短路评估概念的工作方式


    如果您想了解更多关于短路的一般信息,可以参考我在博客上写的一篇文章-

    作为Kotlin用户的更新,您可以使用Kotlin std库中的'or'运算符来检查If语句中的所有表达式,而不执行短路

    在初始问题中给出的表达式中,Kotlin中的代码应为:

    if(isVeryLikely() or isSomewhatLikely() or isHardlyLikely()) {
        ...
    }
    
    并非所有的“布尔表达式”;您可以将
    &
    |
    与布尔一起使用,它们不会短路。规范中的声明: