发布
社区首页 >问答首页 >一个if语句中的两个条件,如果第一个条件为false,那么第二个条件是否重要?

一个if语句中的两个条件,如果第一个条件为false,那么第二个条件是否重要?
EN

Stack Overflow用户
提问于 2013-05-17 17:44:42
回答 7查看 96K关注 0票数 45

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

代码语言:javascript
代码运行次数:0
复制
public static void main(String[] args) {
    int[] list = {1,2};
    if (list.length>2 && list[3] == 2){
        System.out.println(list[1]);
    }
}

这里的语句

代码语言:javascript
代码运行次数:0
复制
if (list.length>2 && list[3] == 2)

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

或者它等于

代码语言:javascript
代码运行次数:0
复制
if (list.length>2){
    if (list[3] == 2){
        ...
    }
}

而且,如果它是用C或python或其他语言编写的呢?

谢谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-05-17 17:48:17

对于语言(包括Java和Python )来说,计算逻辑AND的第一个参数并在第一个参数为false的情况下完成语句的计算是很常见的。这是因为:

来自The Order of Evaluation of Logic Operators

当Java计算表达式d=b && c;时,它首先检查b是否为真。这里b为false,因此无论c是否为true,b && c都必须为false,所以Java不会检查c的值。

这被称为short-circuit evaluation,并且在Java docs中也被引用。

常见的情况是使用list.count > 0 && list[0] == "Something"检查列表元素(如果存在)。

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

代码语言:javascript
代码运行次数:0
复制
if (list.length>2){
    if (list[3] == 2){
        ...
    }
}

如果之后有else的话。else将仅应用于它所附加到的if语句。

要演示此陷阱,请执行以下操作:

代码语言:javascript
代码运行次数:0
复制
if (x.kind.equals("Human")) {
    if (x.name.equals("Jordan")) {
        System.out.println("Hello Jordan!");
    }
} else {
    System.out.println("You are not a human!");
}

将按预期工作,但是

代码语言:javascript
代码运行次数:0
复制
if (x.kind.equals("Human") && x.name.equals("Jordan")) {
    System.out.println("Hello Jordan!");
} else {
    System.out.println("You are not a human!");
}

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

票数 65
EN

Stack Overflow用户

发布于 2013-05-17 17:45:54

是。如果第一个条件不满足,则不对其余条件求值。这被称为短路。有关更多详细信息,请参阅here。请注意,这并不是Java所特有的,许多其他语言也会这样做。

票数 22
EN

Stack Overflow用户

发布于 2013-05-17 17:48:17

直接从javadoc中:

条件运算符

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

&&条件-AND ||条件-OR

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16606021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档