中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

2.2基本運(yùn)算符-創(chuàng)新互聯(lián)

本頁包含內(nèi)容:

創(chuàng)新互聯(lián)是一家專業(yè)提供鹽池企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為鹽池眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
  • 術(shù)語

  • 賦值運(yùn)算符

  • 數(shù)值運(yùn)算符

  • 組合賦值運(yùn)算符(Compound Assignment Operators)

  • 比較運(yùn)算符

  • 三元條件運(yùn)算符(Ternary Conditional Operator)

  • 區(qū)間運(yùn)算符

  • 邏輯運(yùn)算符

運(yùn)算符是檢查、改變、合并值的特殊符號或短語。例如,加號+將兩個(gè)數(shù)相加(如let i = 1 + 2)。復(fù)雜些的運(yùn)算例如邏輯與運(yùn)算符&&(如if enteredDoorCode && passedRetinaScan),或讓 i 值加1的便捷自增運(yùn)算符++i等。

Swift 支持大部分標(biāo)準(zhǔn) C 語言的運(yùn)算符,且改進(jìn)許多特性來減少常規(guī)編碼錯(cuò)誤。如:賦值符(=)不返回值,以防止把想要判斷相等運(yùn)算符(==)的地方寫成賦值符導(dǎo)致的錯(cuò)誤。數(shù)值運(yùn)算符(+,-,*,/,%等)會檢測并不允許值溢出,以此來避免保存變量時(shí)由于變量大于或小于其類型所能承載的范圍時(shí)導(dǎo)致的異常結(jié)果。當(dāng)然允許你使用 Swift 的溢出運(yùn)算符來實(shí)現(xiàn)溢出。詳情參見溢出運(yùn)算符。

區(qū)別于 C 語言,在 Swift 中你可以對浮點(diǎn)數(shù)進(jìn)行取余運(yùn)算(%),Swift 還提供了 C 語言沒有的表達(dá)兩數(shù)之間的值的區(qū)間運(yùn)算符,(a..b和a...b),這方便我們表達(dá)一個(gè)區(qū)間內(nèi)的數(shù)值。

本章節(jié)只描述了 Swift 中的基本運(yùn)算符,高級運(yùn)算符包含了高級運(yùn)算符,及如何自定義運(yùn)算符,及如何進(jìn)行自定義類型的運(yùn)算符重載。

術(shù)語

運(yùn)算符有一元、二元和三元運(yùn)算符。

  • 一元運(yùn)算符對單一操作對象操作(如-a)。一元運(yùn)算符分前置符和后置運(yùn)算符,前置運(yùn)算符需緊排操作對象之前(如!b),后置運(yùn)算符需緊跟操作對象之后(如i++)。

  • 二元運(yùn)算符操作兩個(gè)操作對象(如2 + 3),是中置的,因?yàn)樗鼈兂霈F(xiàn)在兩個(gè)操作對象之間。

  • 三元運(yùn)算符操作三個(gè)操作對象,和 C 語言一樣,Swift 只有一個(gè)三元運(yùn)算符,就是三元條件運(yùn)算符(a ? b : c)。

受運(yùn)算符影響的值叫操作數(shù),在表達(dá)式1 + 2中,加號+是二元運(yùn)算符,它的兩個(gè)操作數(shù)是值1和2。

賦值運(yùn)算符

賦值運(yùn)算(a = b),表示用b的值來初始化或更新a的值:

let b = 10
var a = 5
a = b
// a 現(xiàn)在等于 10

如果賦值的右邊是一個(gè)多元組,它的元素可以馬上被分解多個(gè)常量或變量:

let (x, y) = (1, 2)
// 現(xiàn)在 x 等于 1, y 等于 2

與 C 語言和 Objective-C 不同,Swift 的賦值操作并不返回任何值。所以以下代碼是錯(cuò)誤的:

if x = y {
    // 此句錯(cuò)誤, 因?yàn)?nbsp;x = y 并不返回任何值
}

這個(gè)特性使你無法把(==)錯(cuò)寫成(=),由于if x = y是錯(cuò)誤代碼,Swift 從底層幫你避免了這些錯(cuò)誤代碼。

數(shù)值運(yùn)算

Swift 中所有數(shù)值類型都支持了基本的四則運(yùn)算:

  • 加法(+)

  • 減法(-)

  • 乘法(*)

  • 除法(/)

1 + 2       // 等于 3
5 - 3       // 等于 2
2 * 3       // 等于 6
10.0 / 2.5  // 等于 4.0

與 C 語言和 Objective-C 不同的是,Swift 默認(rèn)不允許在數(shù)值運(yùn)算中出現(xiàn)溢出情況。但你可以使用 Swift 的溢出運(yùn)算符來達(dá)到你有目的的溢出(如a &+ b)。詳情參見溢出運(yùn)算符。

加法運(yùn)算符也可用于String的拼接:

"hello, " + "world"  // 等于 "hello, world"

兩個(gè)Character值或一個(gè)String和一個(gè)Character值,相加會生成一個(gè)新的String值:

let dog: Character = "d"
let cow: Character = "c"
let dogCow = dog + cow
// 譯者注: 原來的引號內(nèi)是很可愛的小狗和小牛, 但win os下不支持表情字符, 所以改成了普通字符
// dogCow 現(xiàn)在是 "dc"

詳情參見字符,字符串的拼接。

求余運(yùn)算

求余運(yùn)算(a % b)是計(jì)算b的多少倍剛剛好可以容入a,返回多出來的那部分(余數(shù))。

注意:
求余運(yùn)算(%)在其他語言也叫取模運(yùn)算。然而嚴(yán)格說來,我們看該運(yùn)算符對負(fù)數(shù)的操作結(jié)果,"求余"比"取模"更合適些。

我們來談?wù)勅∮嗍窃趺椿厥拢?jì)算9 % 4,你先計(jì)算出4的多少倍會剛好可以容入9中:

2.2 基本運(yùn)算符

2倍,非常好,那余數(shù)是1(用橙色標(biāo)出)

在 Swift 中這么來表達(dá):

9 % 4    // 等于 1

為了得到a % b的結(jié)果,%計(jì)算了以下等式,并輸出余數(shù)作為結(jié)果:

a = (b × 倍數(shù)) + 余數(shù)

當(dāng)倍數(shù)取大值的時(shí)候,就會剛好可以容入a中。

把9和4代入等式中,我們得1:

9 = (4 × 2) + 1

同樣的方法,我來們計(jì)算 -9 % 4:

-9 % 4   // 等于 -1

把-9和4代入等式,-2是取到的大整數(shù):

-9 = (4 × -2) + -1

余數(shù)是-1。

在對負(fù)數(shù)b求余時(shí),b的符號會被忽略。這意味著 a % b 和 a % -b的結(jié)果是相同的。

浮點(diǎn)數(shù)求余計(jì)算

不同于 C 語言和 Objective-C,Swift 中是可以對浮點(diǎn)數(shù)進(jìn)行求余的。

8 % 2.5 // 等于 0.5

這個(gè)例子中,8除于2.5等于3余0.5,所以結(jié)果是一個(gè)Double值0.5。

2.2 基本運(yùn)算符

自增和自增運(yùn)算

和 C 語言一樣,Swift 也提供了方便對變量本身加1或減1的自增(++)和自減(--)的運(yùn)算符。其操作對象可以是×××和浮點(diǎn)型。

var i = 0
++i      // 現(xiàn)在 i = 1

每調(diào)用一次++i,i的值就會加1。實(shí)際上,++i是i = i + 1的簡寫,而--i是i = i - 1的簡寫。

++和--既是前置又是后置運(yùn)算。++i,i++,--i和i--都是有效的寫法。

我們需要注意的是這些運(yùn)算符修改了i后有一個(gè)返回值。如果你只想修改i的值,那你就可以忽略這個(gè)返回值。但如果你想使用返回值,你就需要留意前置和后置操作的返回值是不同的。

  • 當(dāng)++前置的時(shí)候,先自増?jiān)俜祷亍?/p>

  • 當(dāng)++后置的時(shí)候,先返回再自增。

例如:

var a = 0
let b = ++a // a 和 b 現(xiàn)在都是 1
let c = a++ // a 現(xiàn)在 2, 但 c 是 a 自增前的值 1

上述例子,let b = ++a先把a(bǔ)加1了再返回a的值。所以a和b都是新值1。

而let c = a++,是先返回了a的值,然后a才加1。所以c得到了a的舊值1,而a加1后變成2。

除非你需要使用i++的特性,不然推薦你使用++i和--i,因?yàn)橄刃薷暮蠓祷剡@樣的行為更符合我們的邏輯。

一元負(fù)號

數(shù)值的正負(fù)號可以使用前綴-(即一元負(fù)號)來切換:

let three = 3
let minusThree = -three       // minusThree 等于 -3
let plusThree = -minusThree   // plusThree 等于 3, 或 "負(fù)負(fù)3"

一元負(fù)號(-)寫在操作數(shù)之前,中間沒有空格。

一元正號

一元正號(+)不做任何改變地返回操作數(shù)的值。

let minusSix = -6
let alsoMinusSix = +minusSix  // alsoMinusSix 等于 -6

雖然一元+做無用功,但當(dāng)你在使用一元負(fù)號來表達(dá)負(fù)數(shù)時(shí),你可以使用一元正號來表達(dá)正數(shù),如此你的代碼會具有對稱美。

復(fù)合賦值(Compound Assignment Operators)

如同強(qiáng)大的 C 語言,Swift 也提供把其他運(yùn)算符和賦值運(yùn)算(=)組合的復(fù)合賦值運(yùn)算符,加賦運(yùn)算(+=)是其中一個(gè)例子:

var a = 1
a += 2 // a 現(xiàn)在是 3

表達(dá)式a += 2是a = a + 2的簡寫,一個(gè)加賦運(yùn)算就把加法和賦值兩件事完成了。

注意:
復(fù)合賦值運(yùn)算沒有返回值,let b = a += 2這類代碼是錯(cuò)誤。這不同于上面提到的自增和自減運(yùn)算符。

在表達(dá)式章節(jié)里有復(fù)合運(yùn)算符的完整列表。

比較運(yùn)算

所有標(biāo)準(zhǔn) C 語言中的比較運(yùn)算都可以在 Swift 中使用。

  • 等于(a == b)

  • 不等于(a != b)

  • 大于(a > b)

  • 小于(a < b)

  • 大于等于(a >= b)

  • 小于等于(a <= b)

注意:
Swift 也提供恒等===和不恒等!==這兩個(gè)比較符來判斷兩個(gè)對象是否引用同一個(gè)對象實(shí)例。更多細(xì)節(jié)在類與結(jié)構(gòu)。

每個(gè)比較運(yùn)算都返回了一個(gè)標(biāo)識表達(dá)式是否成立的布爾值:

1 == 1   // true, 因?yàn)?nbsp;1 等于 1
2 != 1   // true, 因?yàn)?nbsp;2 不等于 1
2 > 1    // true, 因?yàn)?nbsp;2 大于 1
1 < 2    // true, 因?yàn)?nbsp;1 小于2
1 >= 1   // true, 因?yàn)?nbsp;1 大于等于 1
2 <= 1   // false, 因?yàn)?nbsp;2 并不小于等于 1

比較運(yùn)算多用于條件語句,如if條件:

let name = "world"
if name == "world" {
    println("hello, world")
} else {
    println("I'm sorry \\(name), but I don't recognize you")
}
// 輸出 "hello, world", 因?yàn)?nbsp;`name` 就是等于 "world"

關(guān)于if語句,請看控制流。

三元條件運(yùn)算(Ternary Conditional Operator)

三元條件運(yùn)算的特殊在于它是有三個(gè)操作數(shù)的運(yùn)算符,它的原型是 問題 ? 答案1 : 答案2。它簡潔地表達(dá)根據(jù)問題成立與否作出二選一的操作。如果問題成立,返回答案1的結(jié)果; 如果不成立,返回答案2的結(jié)果。

使用三元條件運(yùn)算簡化了以下代碼:

if question: {
  answer1
} else {
  answer2
}

這里有個(gè)計(jì)算表格行高的例子。如果有表頭,那行高應(yīng)比內(nèi)容高度要高出50像素; 如果沒有表頭,只需高出20像素。

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight 現(xiàn)在是 90

這樣寫會比下面的代碼簡潔:

let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
    rowHeight = rowHeight + 50
} else {
    rowHeight = rowHeight + 20
}
// rowHeight 現(xiàn)在是 90

第一段代碼例子使用了三元條件運(yùn)算,所以一行代碼就能讓我們得到正確答案。這比第二段代碼簡潔得多,無需將rowHeight定義成變量,因?yàn)樗闹禑o需在if語句中改變。

三元條件運(yùn)算提供有效率且便捷的方式來表達(dá)二選一的選擇。需要注意的事,過度使用三元條件運(yùn)算就會由簡潔的代碼變成難懂的代碼。我們應(yīng)避免在一個(gè)組合語句使用多個(gè)三元條件運(yùn)算符。

區(qū)間運(yùn)算符

Swift 提供了兩個(gè)方便表達(dá)一個(gè)區(qū)間的值的運(yùn)算符。

閉區(qū)間運(yùn)算符

閉區(qū)間運(yùn)算符(a...b)定義一個(gè)包含從a到b(包括a和b)的所有值的區(qū)間。 閉區(qū)間運(yùn)算符在迭代一個(gè)區(qū)間的所有值時(shí)是非常有用的,如在for-in循環(huán)中:

for index in 1...5 {
    println("\\(index) * 5 = \\(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25

關(guān)于for-in,請看控制流。

半閉區(qū)間

半閉區(qū)間(a..b)定義一個(gè)從a到b但不包括b的區(qū)間。 之所以稱為半閉區(qū)間,是因?yàn)樵搮^(qū)間包含第一個(gè)值而不包括最后的值。

半閉區(qū)間的實(shí)用性在于當(dāng)你使用一個(gè)0始的列表(如數(shù)組)時(shí),非常方便地從0數(shù)到列表的長度。

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..count {
    println("第 \\(i + 1) 個(gè)人叫 \\(names[i])")
}
// 第 1 個(gè)人叫 Anna
// 第 2 個(gè)人叫 Alex
// 第 3 個(gè)人叫 Brian
// 第 4 個(gè)人叫 Jack

數(shù)組有4個(gè)元素,但0..count只數(shù)到3(最后一個(gè)元素的下標(biāo)),因?yàn)樗前腴]區(qū)間。關(guān)于數(shù)組,請查閱數(shù)組。

邏輯運(yùn)算

邏輯運(yùn)算的操作對象是邏輯布爾值。Swift 支持基于 C 語言的三個(gè)標(biāo)準(zhǔn)邏輯運(yùn)算。

  • 邏輯非(!a)

  • 邏輯與(a && b)

  • 邏輯或(a || b)

邏輯非

邏輯非運(yùn)算(!a)對一個(gè)布爾值取反,使得true變false,false變true。

它是一個(gè)前置運(yùn)算符,需出現(xiàn)在操作數(shù)之前,且不加空格。讀作非 a,然后我們看以下例子:

let allowedEntry = false
if !allowedEntry {
    println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"

if !allowedEntry語句可以讀作 "如果 非 alowed entry。",接下一行代碼只有在如果 "非 allow entry" 為true,即allowEntry為false時(shí)被執(zhí)行。

在示例代碼中,小心地選擇布爾常量或變量有助于代碼的可讀性,并且避免使用雙重邏輯非運(yùn)算,或混亂的邏輯語句。

邏輯與

邏輯與(a && b)表達(dá)了只有a和b的值都為true時(shí),整個(gè)表達(dá)式的值才會是true。

只要任意一個(gè)值為false,整個(gè)表達(dá)式的值就為false。事實(shí)上,如果第一個(gè)值為false,那么是不去計(jì)算第二個(gè)值的,因?yàn)樗呀?jīng)不可能影響整個(gè)表達(dá)式的結(jié)果了。這被稱做 "短路計(jì)算(short-circuit evaluation)"。

以下例子,只有兩個(gè)Bool值都為true的時(shí)候才允許進(jìn)入:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"

邏輯或

邏輯或(a || b)是一個(gè)由兩個(gè)連續(xù)的|組成的中置運(yùn)算符。它表示了兩個(gè)邏輯表達(dá)式的其中一個(gè)為true,整個(gè)表達(dá)式就為true。

同邏輯與運(yùn)算類似,邏輯或也是"短路計(jì)算"的,當(dāng)左端的表達(dá)式為true時(shí),將不計(jì)算右邊的表達(dá)式了,因?yàn)樗豢赡芨淖冋麄€(gè)表達(dá)式的值了。

以下示例代碼中,第一個(gè)布爾值(hasDoorKey)為false,但第二個(gè)值(knowsOverridePassword)為true,所以整個(gè)表達(dá)是true,于是允許進(jìn)入:

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "Welcome!"

組合邏輯

我們可以組合多個(gè)邏輯運(yùn)算來表達(dá)一個(gè)復(fù)合邏輯:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "Welcome!"

這個(gè)例子使用了含多個(gè)&&和||的復(fù)合邏輯。但無論怎樣,&&和||始終只能操作兩個(gè)值。所以這實(shí)際是三個(gè)簡單邏輯連續(xù)操作的結(jié)果。我們來解讀一下:

如果我們輸入了正確的密碼并通過了視網(wǎng)膜掃描; 或者我們有一把有效的鑰匙; 又或者我們知道緊急情況下重置的密碼,我們就能把門打開進(jìn)入。

前兩種情況,我們都不滿足,所以前兩個(gè)簡單邏輯的結(jié)果是false,但是我們是知道緊急情況下重置的密碼的,所以整個(gè)復(fù)雜表達(dá)式的值還是true。

使用括號來明確優(yōu)先級

為了一個(gè)復(fù)雜表達(dá)式更容易讀懂,在合適的地方使用括號來明確優(yōu)先級是很有效的,雖然它并非必要的。在上個(gè)關(guān)于門的權(quán)限的例子中,我們給第一個(gè)部分加個(gè)括號,使用它看起來邏輯更明確:

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// 輸出 "Welcome!"

這括號使得前兩個(gè)值被看成整個(gè)邏輯表達(dá)中獨(dú)立的一個(gè)部分。雖然有括號和沒括號的輸出結(jié)果是一樣的,但對于讀代碼的人來說有括號的代碼更清晰??勺x性比簡潔性更重要,請?jiān)诳梢宰屇愦a變清晰地地方加個(gè)括號吧!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享名稱:2.2基本運(yùn)算符-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://www.rwnh.cn/article26/doeecg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、App設(shè)計(jì)網(wǎng)站改版、用戶體驗(yàn)、響應(yīng)式網(wǎng)站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
保定市| 承德县| 白沙| 和林格尔县| 高要市| 满城县| 逊克县| 凯里市| 独山县| 剑河县| 孝义市| 和静县| 安平县| 莎车县| 莱阳市| 海淀区| 武清区| 济阳县| 乳源| 惠州市| 安福县| 桂林市| 梧州市| 凌云县| 建始县| 肥东县| 霍州市| 和林格尔县| 二连浩特市| 洛隆县| 潜江市| 东阿县| 沂南县| 阿巴嘎旗| 美姑县| 沅江市| 莆田市| 通江县| 新巴尔虎右旗| 延川县| 海阳市|