一个if语句中有两个条件,如果第一个条件为假,第二个条件是否会起作用?

55

好的,我有这段代码已经测试过了,发现没有任何异常被抛出。

public static void main(String[] args) {
    int[] list = {1,2};
    if (list.length>2 && list[3] == 2){
        System.out.println(list[1]);
    }
}

这里的陈述是否

if (list.length>2 && list[3] == 2)

这意味着如果第一个条件为假,我们甚至不需要检查第二个条件吗?

或者它等同于

if (list.length>2){
    if (list[3] == 2){
        ...
    }
}

如果它是用C或Python或其他语言编写的呢?

谢谢


2
你的两种方法是等价的。 - Ricardo Cacheira
2
Java遵循短路求值(Short circuit evaluation)来验证表达式。 - Vasu
1
短路评估允许您评估仅在第一个条件合法的情况下才合法的条件。您经常会看到这样的代码:if(string != null && string.length > 5) - Dustfinger
2
@RicardoCacheira 实际上它们非常不同。看看第一个答案。 - user7627726
7个回答

76

通常,编程语言(包括Java和Python)会对逻辑运算符的第一个参数进行求值,并在第一个参数为 false 的情况下完成语句的求值。这是因为:

根据逻辑运算符的求值顺序

当Java对表达式 d = b && c 进行求值时,它首先检查 b 是否为真。在这里,b 是假的,因此无论 c 是否为真,b && c 都必须是假的,所以Java不会再检查 c 的值。

这被称为短路求值,在Java文档中也有提到。

常见于使用条件判断语句 list.count > 0 && list[0] == "Something" 来检查列表元素是否存在。


值得一提的是,if (list.length>2 && list[3] == 2) 与第二种情况并不相等。

if (list.length>2){
    if (list[3] == 2){
        ...
    }
}

如果之后有一个else,则else仅适用于其所附加的if语句。

为了演示这个问题:

if (x.kind.equals("Human")) {
    if (x.name.equals("Jordan")) {
        System.out.println("Hello Jordan!");
    }
} else {
    System.out.println("You are not a human!");
}

将如预期般工作,但是

if (x.kind.equals("Human") && x.name.equals("Jordan")) {
    System.out.println("Hello Jordan!");
} else {
    System.out.println("You are not a human!");
}

还会告诉任何不是Jordan的人他们不是人类。


4
最后一个区块是公平的。只有“乔丹”才能统治世界。 - TheBrenny
1
Python的位运算符(&,|)不支持短路。但是Python的以下运算符支持短路:andoranyall - anilbey

27

是的,如果第一个条件不满足,则不会评估其余条件。这被称为 短路。有关更多详细信息,请参见此处。请注意,这不仅适用于Java,许多其他语言也会这样做。


19

来自javadoc的解释:

条件运算符

&&和||运算符分别对两个布尔表达式执行条件AND和条件OR操作。这些运算符表现出“短路”行为,这意味着只有在需要时才会评估第二个操作数。

&& 条件AND || 条件OR


完美的答案!再加一个短路概念的支持! - Gaurav

4
是的,两种用法在语义上是等价的......也就是说,除非长度大于2,否则代码允许访问超过第二个元素。
在第一种情况下,重要的是&&运算符,将其视为: 如果第一个条件为真,那么应用第二个条件。
随后的条件也有一个隐含的“then”子句。
if length greater than two
 then access third element

3
如果第一个条件为假,则不会检查第二个条件,因为任何东西 && F = F。这又取决于您正在进行哪种位运算。例如,在OR(||)的情况下,如果第一个条件为真(T),则不会检查第二个条件,因为anything || T = T,但如果它为假(F),则肯定会检查第二个条件。

3

在你的IF语句中,你指定了两个条件都必须为真才能执行System.out.println。因此,如果第一个条件本身失败,则不会检查第二个条件(这是AND运算符)。但是,如果你在IF语句中指定了OR运算符,则将检查第二个条件。


0

由于在表达式的完全评估之前结果已经明确,所以不会读取完整表达式,直接返回结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接