短路運算子和

用於分支

短路條件運算子 &&||可以用作以下結構的輕量級替換:

  • x && y 相當於 x ? y : x
  • x || y 相當於 x ? x : y

短路操作符的一種用途是作為一種更簡潔的方式來測試條件並根據該條件執行特定操作。例如,如果引數 x 為負,則以下程式碼使用 && 運算子丟擲錯誤:

function mysqrt(x)
    x < 0 && throw(DomainError("x is negative"))
    x ^ 0.5
end

所述||操作者也可用於錯誤檢查,不同之處在於它觸發誤差*,除非*一個條件成立,而不是如果該條件成立:

function halve(x::Integer)
    iseven(x) || throw(DomainError("cannot halve an odd number"))
    x ÷ 2
end

另一個有用的應用是為物件提供預設值,只有先前沒有定義它:

isdefined(:x) || (x = NEW_VALUE)

這裡,檢查是否定義了符號 x(即,是否存在分配給物件 x 的值)。如果是這樣,那麼什麼都沒發生但是,如果沒有,那麼 x 將被分配到 NEW_VALUE。請注意,此示例僅適用於頂級範圍。

在條件

運算子也很有用,因為它們可用於測試兩個條件,第二個條件僅根據第一個條件的結果進行評估。來自 Julia 文件

在表示式 a && b 中,僅當 a 評估為 true 時,才會評估子表示式 b

在表示式 a || b 中,僅當 a 評估為 false 時,才會評估子表示式 b

因此,如果 ab 都是 truea & ba && b 都將產生 true,如果 afalse,它們的行為是不同的。

例如,假設我們希望檢查物件是否為正數,其中可能甚至不是數字。考慮這兩個嘗試的實現之間的差異:

CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false

CheckPositive1("a")
CheckPositive2("a")

如果將非數字型別作為引數提供給 CheckPositive1() 將產生錯誤。這是因為無論第一個表示式的結果如何,它都會計算兩個表示式,而第二個表示式在嘗試將其計算為非數字型別時會產生錯誤。

但是,如果提供非數字型別,則 CheckPositive2() 將產生 false(而不是錯誤),因為僅當第一個表示式為 true 時才計算第二個表示式。

不止一個短路運算子可以連線在一起。例如:

1 > 0 && 2 > 0 && 3 > 5