什麼是短路求值
邏輯運算 and(且)與 or(或)在只看左側的值就能決定結果時,不評估右側的評估方式。and 在左側為偽時、or 在左側為真時,不評估右側。常用於把陣列範圍的確認寫在左側,以防止參照範圍外。
日文名稱: 短絡評価
「短路求值」出現在2領域的3道練習題中(程式設計基礎(虛擬碼追蹤), C語言基礎等)。
這個名詞所屬的領域: 程式設計基礎(虛擬碼追蹤)
邏輯運算 and(且)與 or(或)在只看左側的值就能決定結果時,不評估右側的評估方式。and 在左側為偽時、or 在左側為真時,不評估右側。常用於把陣列範圍的確認寫在左側,以防止參照範圍外。
日文名稱: 短絡評価
「短路求值」出現在2領域的3道練習題中(程式設計基礎(虛擬碼追蹤), C語言基礎等)。
這個名詞所屬的領域: 程式設計基礎(虛擬碼追蹤)
右側的式子含有函式呼叫或陣列參照時,是否為短路求值會使結果不同。「i ≦ n and a[i] ≠ x」在 i 超過 n 時左側為偽,因此不會參照範圍外的 a[i]。若左右對調,就會先參照範圍外。若右側呼叫的函式會改寫變數,函式被呼叫的次數也會改變。
在C、Java、Python等許多語言中,邏輯運算的 && 與 ||(Python 為 and 與 or)是短路求值。C與Java的 & 與 | 則一定評估兩側。在虛擬碼的題目中,若短路求值會影響結果,應依照題目的說明。
利用短路求值,可以把「在陣列範圍內,且該元素滿足條件」這種只有在前面的條件成立時才有意義的條件寫成一個式子。把耗時的判斷放在右側,就能在左側已決定結果時省略它。另一方面,若把一定要執行的處理放進右側的函式,它可能不會被呼叫,需要注意。
在C、Java、Python等語言中,短路求值不是編譯器的最佳化,而是語言規定的一部分。因此,即使撰寫以右側不被評估為前提的程式,也保證能正確運作。
根據笛摩根定律,兩者的邏輯值相同。not (i > n or a[i] = x) 與 i ≦ n and a[i] ≠ x 在只靠 i 的條件就能決定結果時,都不會評估 a[i]。
依賴短路求值時,要把範圍的確認寫在左側。
下列程式在元素數為 n 的陣列 a 中尋找值 x,並把找到的元素編號求到 i。陣列的元素編號從1開始。and 與 or…&& 在左邊為偽時、|| 在左邊為真時,不會求值右邊(短路求值)。
執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?