Two conditions in one if statement does the second matter if the first is false?

albusshin picture albusshin · May 17, 2013 · Viewed 81.5k times · Source

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

Answer

Elle picture Elle · May 17, 2013

It is common for languages (Java and Python are among them) to evaluate the first argument of a logical AND and finish evaluation of the statement if the first argument is false. This is because:

From The Order of Evaluation of Logic Operators,

When Java evaluates the expression d = b && c;, it first checks whether b is true. Here b is false, so b && c must be false regardless of whether c is or is not true, so Java doesn't bother checking the value of c.

This is known as short-circuit evaluation, and is also referred to in the Java docs.

It is common to see list.count > 0 && list[0] == "Something" to check a list element, if it exists.


It is also worth mentioning that if (list.length>2 && list[3] == 2) is not equal to the second case

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

if there is an else afterwards. The else will apply only to the if statement to which it is attached.

To demonstrate this gotcha:

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

will work as expected, but

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

will also tell any Human who isn't Jordan they are not human.