条件顺序是否在while循环中对多个条件有影响?

时间:2017-03-01 04:51:18

标签: java while-loop conditional-statements

我无法找到这个问题的答案。我正在处理插入排序方法,它无法正确执行:

public static <T extends Comparable<? super T>> void insertionSort(T[] array) {
    int length = array.length;
    T temp;
    for (int i = 1; i < length; i++) { //start of unsorted
        temp = array[i]; //save the element
        int j = i-1;
        while (temp.compareTo(array[j]) < 0 && j >= 0) { // while temp is less than array[j]
            array[j+1] = array[j]; 
            j--;
        } //end of while
        array[j+1] = temp; //as soon as temp is greater than array[j], set array[j] equal to temp
    }
}

这在while循环行返回ArrayIndexOutOfBoundsException,但当我将while循环中的条件切换到此时:

while (j >= 0 && temp.compareTo(array[j]) < 0)

它奏效了。我没想到在Java中,while循环中的条件顺序对程序很重要吗?这对我来说很奇怪,因为我在&&的声明中从未见过或听说过顺序问题,因为我认为两个while循环行是等价的。我被困了一段时间,一直无法找到答案。

有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

条件从左到右评估。

最初,对于案例j=-1,您的代码未评估第二个条件,因为第一个条件是抛出ArrayIndexOutOfBoundsException例外。

while (temp.compareTo(array[j]) < 0 && j >= 0)

但是当你改变这样的条件时:

while (j >= 0 && temp.compareTo(array[j]) < 0)

然后对于相同的情况(j=-1),因为第一个条件变为false,那么无论第二个值如何,整个条件总是为假;所以第二个条件不会被评估,因此在这种情况下也不例外。

答案 1 :(得分:0)

让我们考虑以下示例:

boolean b = Condition_1 && Condition_2;

现在,如果Condition_1始终为false,那么无论Condition_2的值如何,b将始终为false。所以当第一个条件是假的&#39;和&#39;然后无需检查第二个条件的值,这就是这里发生的事情。

答案 2 :(得分:0)

如果您使用条件while (temp.compareTo(array[j]) < 0 && j >= 0),则完全错误 在Java中,它首先检查条件&&,然后检查||。 在条件&&中,它检查顺序。 因此,在您的情况while (temp.compareTo(array[j]) < 0 && j >= 0)中,它首先检查此条件temp.compareTo(array[j])。如果j超出数组索引,==&gt;你得到错误

当您将条件更改为while (j >= 0 && temp.compareTo(array[j]) < 0)时,它首先检查j>=0,如果j = -1该程序无法继续进行。