2017-03-01 79 views
0

我無法找到這個問題的答案。我工作的一個插入排序方法,它不會正確執行:條件順序在while循環中與多個條件有關嗎?

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循環行是等價的。我被困住了一會兒,並找不到答案。

有人可以解釋爲什麼這樣嗎?

+0

如果第一個表達式評估爲「false」,那麼'&&'不會計算第二個表達式。閱讀[定義的第一行](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.23)。 – 4castle

+0

條件從左到右進行評估。 java使用短路邏輯。對於AND操作,如果左邊的條件爲假,那麼它不會評估右邊的條件。 –

+0

這*編譯*就好了。我願意成爲它不正確運行*。 – Makoto

回答

1

條件從左到右進行評估。

最初,對於案例j=-1,您的代碼沒有評估第二個條件,因爲第一個條件拋出了ArrayIndexOutOfBoundsException異常。

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

然而,當你切換這樣的條件:

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

然後對於相同的情況下(j=-1)中,由於第一條件變得false,那麼不管第二值,整個條件總是是假的;所以第二個條件不會被評估,因此在這種情況下也不例外。

0

讓我們考慮下面的例子:

boolean b = Condition_1 && Condition_2; 

現在,如果Condition_1始終是假的那麼無論Condition_2的價值,B將永遠是假的。所以當第一個條件是'和'的假時,那麼就不需要檢查這裏發生的第二個條件的值。

0

如果使用條件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程序無法走得更遠。