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]
。但通过短路,它不必试图让你知道的检查失败。