【发布时间】:2017-07-20 06:59:22
【问题描述】:
我无法找到这个问题的答案。我正在研究一种插入排序方法,但它无法正确执行:
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 循环行是等效的。我一直在想这个问题,找不到答案。
谁能解释为什么会这样?
【问题讨论】:
-
如果第一个表达式的计算结果为
false,&&将不会计算第二个表达式。阅读first line of the definition。 -
条件从左到右进行评估。 java使用短路逻辑。对于 AND 操作,如果左侧条件为假,则不会评估右侧条件。
-
这个编译就好了。我愿意让它没有正确运行。
-
至于“为什么”,性能是一个原因(如果您已经知道结果将是什么,则无需继续评估。)但是您的确切情况是另一个原因。如果它总是同时评估两者,那么您将无法进行安全检查以确保
j>=0与检查array[j]的位置在同一行,因为它总是会尝试检查array[j],即使它越界。但是通过短路,它不必尝试进行您知道会失败的检查。
标签: java while-loop conditional-statements