在本文中,您將了解用于計算帶有運算符和操作數(shù)的表達式的規(guī)則。
運算符優(yōu)先級是用于計算給定數(shù)學(xué)表達式的規(guī)則集合。當(dāng)在單個表達式中使用多個運算符時,每個部分按照稱為運算符優(yōu)先級的特定順序進行計算。某些運算符具有比其他運算符更高的優(yōu)先級,這會影響表達式的計算方式。
下表列出了Swift中運算符的優(yōu)先級。它在表格中顯示的越高,其優(yōu)先級越高。
運算符組 | 示例 |
位改變優(yōu)先級 | >> &<< &>> >> |
乘法運算優(yōu)先級 | &* % & * / |
加法優(yōu)先級 | | &+ &- + – ^ |
范圍形成優(yōu)先 | ..< … |
類型轉(zhuǎn)換優(yōu)先級 | is as |
空合運算符優(yōu)先級 | ?? |
比較優(yōu)先級 | != > < >= <= === == |
邏輯結(jié)合優(yōu)先級 | && |
邏輯析取優(yōu)先級 | || |
默認優(yōu)先級 | ~> |
三元運算符優(yōu)先級 | ?: |
箭頭函數(shù)優(yōu)先級 | ( ) |
賦值優(yōu)先級 | |= %= /= &<<= &>>= &= *= >>= <<= ^= += -= |
let x = 4 + 5 * 5 print(x)
當(dāng)您運行上述程序時,輸出將是:
29
在上面的示例中,如果從左到右讀取表達式,則可能期望輸出為45。但是,乘法運算符的優(yōu)先級高于加法運算符,因此表達式4 + 5 * 5被求值為4 + (5 * 5)。因此在屏幕上打印(x)輸出29。
步驟 | 運算符 | 表達式 | 從表達式返回的值 |
---|---|---|---|
1 | * | 5 * 5 | 25 |
2 | + | 4 + 25 | 29 |
3 | = | print(x) | 29 |
var y = 15 y += 10 - 2 * 3 print(y)
當(dāng)您運行上述程序時,輸出將是:
19
在上面的實例中,變量 y 的表達式 var y = 15賦值為15。
在下一個表達式 y + = 10-2 * 3中,乘法運算符的優(yōu)先級高于減法復(fù)合賦值運算符(+ =)。
因此,表達式 y + = 10-2 * 3 被計算為 y = y + (10-(2 * 3))。
步驟 | 運算符 | 表達式 | 表達式返回的值 |
1 | = | var y = 15 | 15 |
2 | * | 2 * 3 | 6 |
3 | -- | 10-6 | 4 |
4 | + = | 15 + 4 | 19 |
盡管存在由運算符優(yōu)先級定義的預(yù)定義規(guī)則來評估表達式,但是您可能想知道如果存在多個相同優(yōu)先級的運算符會發(fā)生什么。 運算符關(guān)聯(lián)性定義了如何將具有相同優(yōu)先級的運算符組合在一起。
在Swift中,運算符可以是左結(jié)合、右結(jié)合或沒有結(jié)合。當(dāng)在表達式中按順序使用時,左結(jié)合運算符、操作數(shù)從語句左側(cè)分組、右側(cè)結(jié)合運算符和無關(guān)聯(lián)運算符沒有定義的行為。
下表顯示了Swift運算符的結(jié)合性及其優(yōu)先級。
運算符組 | 示例 | 結(jié)合性 |
---|---|---|
按位移位優(yōu)先級 | >>&<<&>> >> | 無 |
乘法運算優(yōu)先級 | &*%&* / | 左結(jié)合 |
加法優(yōu)先級 | | &+&-+-^ | 左結(jié)合 |
范圍形成優(yōu)先級 | .. <... | 無 |
類型轉(zhuǎn)換優(yōu)先級 | is a | 無 |
空合運算符優(yōu)先級 | ?? | 右結(jié)合 |
比較優(yōu)先級 | !=> <> = <= === == | 無 |
邏輯與優(yōu)先級 | && | 左結(jié)合 |
邏輯析取優(yōu)先級 | || | 左結(jié)合 |
默認優(yōu)先級 | ~> | 無 |
三元運算符優(yōu)先級 | ?: | 右結(jié)合 |
箭頭函數(shù)優(yōu)先級 | () | 右結(jié)合 |
賦值優(yōu)先級 | | =%= / =&<< =&>> =&= * = >> = << = ^ = | 右結(jié)合 |
let x = 40 / 2 * 10 print(x)
當(dāng)您運行上述程序時,輸出將是:
200
在上面的程序中,表達式從左到右進行計算,因為運算符屬于乘法優(yōu)先組,并具有左結(jié)合性。因此,除法操作會提前執(zhí)行,結(jié)果是200。如果您想先執(zhí)行乘法運算,該怎么辦?需要將2 * 10表達式包裝到()大括號中,如下所示:
let x = 40 / (2 * 10) print(x)
當(dāng)您運行上述程序時,輸出將是:
2
您無需記住優(yōu)先級和結(jié)合表。在大多數(shù)情況下,運算符的優(yōu)先級和結(jié)合性本身就是很有意義的。如有疑問,您可以隨時使用該表作為參考。另外,最好使用括號使代碼更易于理解。