49

Okay, so I have this piece of code tested and I found there isn't any exception thrown out.

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

Does the statement here

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

mean that if the first condition is false we don't even have to check the second condition?

Or it equals to

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

?

And, what if it is written in C or python or some other languages?

Thanks

4

7 回答 7

68

语言(其中包括 Java 和 Python)评估逻辑的第一个参数AND并在第一个参数是 时完成语句的评估是很常见的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他们不是人类。

于 2013-05-17T09:48:17.003 回答
23

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

于 2013-05-17T09:45:54.417 回答
15

直接来自javadoc:

条件运算符

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

&& 条件与 || 条件或

于 2013-05-17T09:48:17.160 回答
4

是的,这两种用法在语义上是等效的……也就是说,除非长度 > 2,否则代码是否允许访问超过第二个元素。

在第一种情况下,重要的是&&运算符,将其视为:如果第一个条件为真,则应用第二个条件。

随后的条件也有一个隐含的“then”子句

if length greater than two
 then access third element
于 2013-05-17T09:46:40.387 回答
3

您已在 IF 语句中指定要执行 System.out.println 的两个条件都应为真。因此,如果第一个条件本身失败,则不检查第二个条件(这是用于 AND 运算符)。但是如果您在 If 语句中指定了 OR 运算符,则将检查第二个条件。

于 2013-05-17T10:10:48.047 回答
3

如果第一个条件为假,那么它不会再次检查第二个条件 && F =F 这取决于您正在执行的按位操作。就像在 OR (||) 的情况下,如果第一个条件为真 (T),它不会检查第二个条件是什么 || T = T 但如果它是假的 (F) 那么它肯定会检查第二个

于 2013-05-17T09:49:37.183 回答
0

它不会读取完整的表达式,因为即使在表达式的完整计算之前结果就很清楚了,并且返回结果

于 2021-02-09T05:51:40.210 回答