簡體   English   中英

while循環條件評估

[英]while loop condition evaluation

我有一段涉及兩個條件的代碼片段,它們進入while循環,但是我對以下代碼的輸出和預期結果感到困惑:

while (curr != null && key.compareTo(curr.getKey()) > 0) {
  prev = curr;
  curr = prev.getNext();
  if (curr == null) {
    System.out.println(curr + " is null");
  }
}

當我運行這段代碼時,我期望它會拋出一個空指針異常,因為curr為null,並且在消息打印出來后我正在對null調用一個方法,但是它正常退出了循環,我想知道這是否是正常行為? 從這里看來,它一次只評估一個條件,但是我認為while循環用一個布爾表達式評估括號內的所有內容?

我進行了一個測試,以另一種方式交換了&&的操作數,然后發現它確實引發了空指針異常! 這是什么原因呢?

問:while循環條件是整體評估還是在決定是否進入循環之前一次評估一個條件?

&&是短路(或短手)運算符。 它將評估第一個條件,如果條件為真,則僅評估第二個條件。

因此,如果我的條件是conditon1 && condition2 ,則當且僅當condition1為true時,它將評估condition2。

因此,在您的情況下,它將評估不為空的條件( curr != null ),如果失敗,則將不評估另一個條件,因此也不會評估NullPointerException,因此您會看到while循環正常退出。

 (curr != null && key.compareTo(curr.getKey()) 

&&確保在運行右之前左為真

&&和|| 操作員“短路”,這意味着如果不需要,他們不會評估右側。

&和| 運算符用作邏輯運算符時,始終會評估雙方。

這是對Java邏輯運算符短路的一個很好的解釋

每個操作員只有一種短路情況,它們是:

 false && ... - it is not necessary to know what the right hand side is, the result must be false true || ... - it is not necessary to know what the right hand side is, the result must be true 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM