Java 条件的顺序对while循环中的多个条件有影响吗?

Java 条件的顺序对while循环中的多个条件有影响吗?,java,while-loop,conditional-statements,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

我找不到这个问题的答案。我正在使用插入排序方法,但无法正确执行:

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
    }
}
成功了。我认为在Java中,while循环中的条件顺序对程序不重要吗?这对我来说非常奇怪,因为我从未见过或听说过在带有
&&
的语句中使用订单关系,因为我假设两条while循环线是等价的。我一直在想这个问题,但找不到答案


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

条件是从左到右计算的

最初,对于案例
j=-1
,您的代码没有计算第二个条件,因为第一个条件引发了
ArrayIndexOutOfBoundsException
异常

while (temp.compareTo(array[j]) < 0 && j >= 0)
while(临时比较(数组[j])<0&&j>=0)
但是,当您切换如下条件时:

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

然后对于相同的情况(
j=-1
),由于第一个条件变为
false
,那么不管第二个值是什么,整个条件都将是false;因此第二个条件不会被计算,因此在这种情况下没有例外。

条件是从左到右计算的

最初,对于案例
j=-1
,您的代码没有计算第二个条件,因为第一个条件引发了
ArrayIndexOutOfBoundsException
异常

while (temp.compareTo(array[j]) < 0 && j >= 0)
while(临时比较(数组[j])<0&&j>=0)
但是,当您切换如下条件时:

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

然后对于相同的情况(
j=-1
),由于第一个条件变为
false
,那么不管第二个值是什么,整个条件都将是false;因此,第二个条件将不被评估,因此在这种情况下也不例外。

让我们考虑下面的例子:

boolean b = Condition_1 && Condition_2;

现在,如果条件_1始终为false,那么无论条件_2的值是多少,b都将始终为false。因此,当第一个条件是“a”和“false”时,则不必检查第二个条件的值,即这里所发生的情况。

让我们考虑下面的例子:

boolean b = Condition_1 && Condition_2;

现在,如果条件_1始终为false,那么无论条件_2的值是多少,b都将始终为false。因此,当“and”的第一个条件为false时,则无需检查第二个条件的值,这正是此处发生的情况。

如果使用条件
while(temp.compareTo(array[j])<0&&j>=0)
在Java中,它首先检查条件
&&
,然后检查条件
| |
。 在条件
&&
中,它按顺序进行检查。 因此,在您的情况下,
while(temp.compareTo(array[j])<0&&j>=0)
,它首先检查这个条件
temp.compareTo(array[j])
。如果
j
超出了数组索引,==>则会出现错误


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

如果您在while(temp.compareTo(array[j])<0&&j>=0)时使用条件

在Java中,它首先检查条件
&&
,然后检查条件
| |
。 在条件
&&
中,它按顺序进行检查。 因此,在您的情况下,
while(temp.compareTo(array[j])<0&&j>=0)
,它首先检查这个条件
temp.compareTo(array[j])
。如果
j
超出了数组索引,==>则会出现错误


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

如果第一个表达式的计算结果为
false
,则不会计算第二个表达式。读取。从左到右评估条件。java使用短路逻辑。对于AND操作,如果左侧条件为false,则不会计算右侧的条件。这可以正常编译。我愿意承认它运行不正确。至于“为什么”,性能是一个原因(如果您已经知道结果会是什么,则无需继续评估),但您的确切场景是另一个原因。如果它总是同时计算这两个值,那么您就无法在检查数组[j]
的同一行上进行安全检查,以确保
j>=0,因为即使超出边界,它也会始终尝试检查
array[j]
。但是通过短路,它不必尝试使您知道的检查失败。
&
将不会计算第二个表达式,如果第一个表达式的计算结果为
false
。读取。从左到右评估条件。java使用短路逻辑。对于AND操作,如果左侧条件为false,则不会计算右侧的条件。这可以正常编译。我愿意承认它运行不正确。至于“为什么”,性能是一个原因(如果您已经知道结果会是什么,则无需继续评估),但您的确切场景是另一个原因。如果它总是同时计算这两个值,那么您就无法在检查数组[j]
的同一行上进行安全检查,以确保
j>=0,因为即使超出边界,它也会始终尝试检查
array[j]
。但通过短路,它不必试图让你知道的检查失败。