什麼是短路求值

邏輯運算 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 (A or B) 與 not A and not B 相同嗎?

根據笛摩根定律,兩者的邏輯值相同。not (i > n or a[i] = x) 與 i ≦ n and a[i] ≠ x 在只靠 i 的條件就能決定結果時,都不會評估 a[i]。

解析中的「短路求值」

出現「短路求值」的題目(3題)

  1. 下列程式的 and 在左側的式子為 false 時不評估右側的式子(短路求值)。cnt 是全域變數。執行後 cnt 的值為下列何者?
  2. 下列程式在元素數為 n 的陣列 a 中尋找值 x,並把找到的元素編號求到 i。陣列的元素編號從1開始。and 與 or 在只看左側的式子就能決定結果時,不評估右側的式子。【a】中填入的條件式中,在 x 不在 a 中時會參照到範圍外 a[n + 1] 的是下列何者?
  3. 執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?

相關名詞

變數 陣列 引數 回傳值 位元運算 取餘運算 物件導向 差一錯誤 追蹤表 捨入誤差

前往名詞解釋列表