2017-05-05 160 views
0

此代碼在for循環條件中使用& &。它重複4次,得到答案「sum = 20」。我認爲它迭代5次,因爲條件的左側條件爲真,當右側變爲假時結束循環。Java短路混淆

基本上我的問題是爲什麼它迭代4次而不是5次,使「總和= 30」?謝謝

`int[] lst = {1,2,3,4,5,4,3,2,1}; 
    int sum = 0; 
    for (int frnt = 0, rear = lst.length - 1; 
      frnt < 5 && rear >= 5; frnt++, rear--){ 
     sum = sum + lst[frnt] + lst[rear]; 
     System.out.println("frnt: " + frnt); 
     System.out.println("rear: " + rear); 
     System.out.println(); 
    } 
    System.out.print(sum);` 
+2

&&是*和*,這意味着*兩個條件必須爲真*,並且爲false將導致條件失敗。 *這和那*必須都是真的。 –

+0

我認爲'兩個條件必須是真的'是爲了&。 &&是短路'和'這意味着如果第一個是真的,它不會評估第二個。無論如何,這就是我所學到的。 – physicalhacker

+2

||對於||來說是正確的(要麼)。對於&&,短路意味着如果第一個是錯誤的,則它不會評估第二個,因爲整個表達式已經是錯誤的。 – clcto

回答

0

短路只發生在整個表達式的值已知時。

對於邏輯AND運算符(& &)如果左側已經是假的,那麼右側的計算結果並不重要,因爲整個表達式已經是假的。如果左側爲真,則右側的值確定表達式的值。由於它在評估之前是未知的,因此必須對其進行評估。

對於邏輯OR運算符(||),反之亦然。如果表達式的左邊是真的,那麼右邊是什麼並不重要,表達式是真實的,所以不評估右邊。如果左側爲假,則表達式的值取決於右側,因此必須對其進行評估。

+0

啊......我混淆了這兩個想法。非常感謝你! – physicalhacker

0

該問題起源於for條件。在循環的最後一次迭代中,frnt = 4rear = 4。條件frnt < 5有效,但rear >= 5爲假,使整個表達式爲false,從而打破循環。在每次迭代之後,請參閱下面的變量(注意,表格顯示每次循環主體運行並且變量已被修改後的變量)。

   frnt rear 
before loop: 0  8 
iteration 1: 1  7 
iteration 2: 2  6 
iteration 3: 3  5 
iteration 4: 4  4 <---- Loop breaks after this 

兩個計數器在4中間相遇,但條件指定rear >= 5。爲了得到正確的行爲,改變條件:frnt < 5 && rear >= 4,或更清楚,frnt <= 4 && rear >= 4

+0

非常感謝! – physicalhacker

0

frnt ---- rear ---------- frnt < 5 && rear >= 5

0 ---- ------- 8 ------------------- true && true -> true

1 ----------- 7 ----- -------------- true && true -> true

2 ----------- 6 ------------------- true && true -> true

3 ----------- 5 ------------------- true && true -> true

4 ----------- 4 ------------- ------ true && false -> false

一切正常,4次迭代,就是這樣。

我想你誤解了短路原理。在& &操作者的情況下,短路原理的工作原理如下:

如甲& &乙操作的結果是true只有在情況下,當兩個操作數都是true然後在評估操作數A和發現它是false,有無需評估和檢查操作數B的值。在操作數A爲true的情況下總是對操作數B進行評估。所以在你的情況下,當循環中斷操作數A是4 < 5,操作數B是4 >= 5。因此,作爲操作數A是true,那麼對操作數B進行評估和檢查是強制性的,並且由於兩個操作數都被求值,所以這種情況不是短路的。如果操作數A是false並且操作數B未被評估,那麼短路情況就是這種情況。

+0

非常感謝! – physicalhacker