運(yùn)算符是用于檢查炼邀、更改或組合一個(gè)或多個(gè)值的特殊符號(hào)或短語债鸡。例如,加法運(yùn)算符(+)將兩個(gè)數(shù)字相加津肛,如在let i=1+2
中所示葫辐,邏輯“與”運(yùn)算符(&&
)將兩個(gè)布爾值合并搜锰,如enteredDoorCode && passedRetinaScan
。
Swift支持我們已經(jīng)從C等語言中了解到的運(yùn)算符耿战,并改進(jìn)了一些功能以消除常見的編碼錯(cuò)誤蛋叼。賦值運(yùn)算符(=)不返回值,以防止在使用相等運(yùn)算符(==)時(shí)錯(cuò)誤地使用它昆箕。算術(shù)運(yùn)算符(+鸦列、-租冠、*鹏倘、/、%等)檢測(cè)并禁止值溢出顽爹,以避免在處理大于或小于存儲(chǔ)類型值范圍的數(shù)字時(shí)出現(xiàn)意外結(jié)果纤泵。我們可以使用Swift的溢出運(yùn)算符選擇值溢出行為,如溢出運(yùn)算符中所述。
Swift還提供了在C中沒有的范圍運(yùn)算符捏题,例如a…<b
和a…b
玻褪,作為表示值范圍的快捷方式。
本章介紹Swift中的常見運(yùn)算符公荧。高級(jí)運(yùn)算符涵蓋了Swift中的高級(jí)運(yùn)算符带射,并描述了如何定義自定義運(yùn)算符,并為我們自定義類型實(shí)現(xiàn)標(biāo)準(zhǔn)運(yùn)算符循狰。
術(shù)語
運(yùn)算符為一元窟社、二元或三元:
- 一元運(yùn)算符操作單個(gè)值(如
-a
)。一元前綴運(yùn)算符緊跟在其目標(biāo)值前面(例如!b
) 绪钥,并且一元后綴運(yùn)算符緊跟在它們的目標(biāo)值后面(例如c!
)灿里。 - 二元運(yùn)算符操作兩個(gè)目標(biāo)值(如
2+3
)并且是中綴,因?yàn)樗鼈兂霈F(xiàn)在兩個(gè)目標(biāo)值之間程腹。 - 三元運(yùn)算符操作三個(gè)目標(biāo)值匣吊。和C一樣,Swift只有一個(gè)三元運(yùn)算符寸潦,三元條件運(yùn)算符(
a ? b :c
)色鸳。
運(yùn)算符影響的值是操作數(shù)。在表達(dá)式1+2
中见转,+符號(hào)是一個(gè)二進(jìn)制運(yùn)算符缕碎,它的兩個(gè)操作數(shù)是值1和2。
賦值運(yùn)算符
賦值運(yùn)算符(a=b)用b值初始化或更新a值:
let b = 10
var a = 5
a = b
// a is now equal to 10
如果賦值的右側(cè)是具有多個(gè)值的元組池户,則其元素可以同時(shí)被分解為多個(gè)常量或變量:
let (x, y) = (1, 2)
// x is equal to 1, and y is equal to 2
與C和Objective-C中的賦值運(yùn)算符不同咏雌,Swift中的賦值運(yùn)算符本身不返回值。以下語句無效:
if x = y {
// This is not valid, because x = y does not return a value.
}
此功能可防止在實(shí)際使用等于運(yùn)算符(==)時(shí)意外使用賦值運(yùn)算符(=)校焦。通過使if x=y無效赊抖,Swift可以幫助我們避免代碼中的此類錯(cuò)誤。
算術(shù)運(yùn)算符
Swift支持所有數(shù)字類型的四個(gè)標(biāo)準(zhǔn)算術(shù)運(yùn)算符:
- 加法(+)
- 減法(-)
- 乘法(*)
- 除法(/)
1 + 2 // equals 3
5 - 3 // equals 2
2 * 3 // equals 6
10.0 / 2.5 // equals 4.0
與C和Objective-C中的算術(shù)運(yùn)算符不同寨典,Swift算術(shù)運(yùn)算符默認(rèn)情況下不允許值溢出氛雪。我們可以通過使用Swift的溢出運(yùn)算符(如a &+ b
)來選擇值溢出行為。請(qǐng)參見溢出運(yùn)算符耸成。
字符串串聯(lián)也支持加法運(yùn)算符:
"hello, " + "world" // equals "hello, world"
余數(shù)運(yùn)算符
余數(shù)運(yùn)算符(a%b
)計(jì)算出a中將容納多少個(gè)b的倍數(shù)报亩,并返回剩余的值(稱為余數(shù))。
注意
余數(shù)運(yùn)算符(%)在其他語言中也稱為模運(yùn)算符井氢。然而在Swift中弦追,嚴(yán)格地說,對(duì)于負(fù)數(shù)而言花竞,它是一個(gè)余數(shù)而不是一個(gè)模運(yùn)算劲件。
下面是余數(shù)運(yùn)算符的工作方式。要計(jì)算9%4,首先計(jì)算出9內(nèi)可容納多少個(gè)4:
在9中包含兩個(gè)4s零远,其余的是1(以橙色顯示)苗分。
在Swift中,這將被寫為:
9 % 4 // equals 1
要確定a%b
的答案牵辣,%運(yùn)算符計(jì)算以下公式并返回余數(shù)作為其輸出:
a=(b * 因子)+余數(shù)
其中摔癣,因子是使得b匹配a的最大倍數(shù)纬向。
在這個(gè)方程中插入9和4得到:
9=(4 x 2)+1
當(dāng)計(jì)算-a的余數(shù)時(shí)供填,采用相同的方法:
-9 % 4 // equals -1
在方程中插入-9和4得到:
-9=(4 x -2)+-1
余數(shù)值為-1。
如果忽略負(fù)值b的符號(hào)罢猪,那么a%b
和a%-b
總是給出相同的答案近她。
一元減號(hào)運(yùn)算符
可以使用前綴-,即一元減號(hào)運(yùn)算符來切換數(shù)值的符號(hào):
let three = 3
let minusThree = -three // minusThree equals -3
let plusThree = -minusThree // plusThree equals 3, or "minus minus three"
一元減號(hào)運(yùn)算符(-)直接在它所操作的值之前加上前綴膳帕,沒有任何空格粘捎。
一元加號(hào)運(yùn)算符
一元加號(hào)運(yùn)算符(+)只返回它所操作的值,沒有任何更改:
let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix equals -6
盡管一元加號(hào)運(yùn)算符實(shí)際上什么都不做危彩,但是當(dāng)一元減號(hào)運(yùn)算符用于負(fù)數(shù)時(shí)攒磨,可以使用它在代碼中為正數(shù)提供對(duì)稱性。
復(fù)合賦值運(yùn)算符
與C類似汤徽,Swift提供復(fù)合賦值運(yùn)算符娩缰,將賦值(=)與另一個(gè)操作結(jié)合起來。比如加法賦值運(yùn)算符(+=):
var a = 1
a += 2
// a is now equal to 3
表達(dá)式a += 2
是a = a + 2
的簡(jiǎn)寫形式谒府。加法和賦值被合并成一個(gè)操作符拼坎,同時(shí)執(zhí)行兩個(gè)任務(wù)也是有效的。
注意
復(fù)合賦值運(yùn)算符不返回值完疫。例如泰鸡,不能將b = a += 2
寫入。
有關(guān)Swift標(biāo)準(zhǔn)庫提供的運(yùn)算符的信息壳鹤,請(qǐng)參閱運(yùn)算符聲明盛龄。
比較運(yùn)算符
Swift支持以下比較運(yùn)算符:
- 等于(
a == b
) - 不等于(
a != b
) - 大于(
a > b
) - 小于(
a < b
) - 大于或等于(
a >= b
) - 小于或等于(
a <= b
)
注意
Swift還提供了兩個(gè)標(biāo)識(shí)運(yùn)算符(===
和!==
),用于測(cè)試兩個(gè)對(duì)象引用是否都引用同一個(gè)對(duì)象實(shí)例芳誓。有關(guān)詳細(xì)信息余舶,請(qǐng)參見標(biāo)識(shí)運(yùn)算符。
每個(gè)比較運(yùn)算符都返回一個(gè)Bool值锹淌,以表示語句是否為真:
1 == 1 // true because 1 is equal to 1
2 != 1 // true because 2 is not equal to 1
2 > 1 // true because 2 is greater than 1
1 < 2 // true because 1 is less than 2
1 >= 1 // true because 1 is greater than or equal to 1
2 <= 1 // false because 2 is not less than or equal to 1
比較運(yùn)算符通常用于條件語句中匿值,例如if語句:
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".
有關(guān)if語句的更多信息,請(qǐng)參見控制流葛圃。
如果兩個(gè)元組具有相同的類型和相同的元素?cái)?shù)量千扔,則可以對(duì)它們進(jìn)行比較。從左到右比較元組库正,每次比較一個(gè)值曲楚,直到比較發(fā)現(xiàn)兩個(gè)不相等的值。而這兩個(gè)值的比較結(jié)果決定了元組比較的總體結(jié)果褥符。如果所有元素都相等龙誊,那么元組本身就是相等的。例如:
(1, "zebra") < (2, "apple") // true because 1 is less than 2; "zebra" and "apple" are not compared
(3, "apple") < (3, "bird") // true because 3 is equal to 3, and "apple" is less than "bird"
(4, "dog") == (4, "dog") // true because 4 is equal to 4, and "dog" is equal to "dog"
在上面的示例中喷楣,我們可以在第一行看到從左到右的比較行為趟大。因?yàn)?小于2,(1, "zebra")
被認(rèn)為小于(2, "apple")
铣焊,而不考慮元組中的任何其他值逊朽。“zebra”比“apple”大并不重要曲伊,因?yàn)楸容^結(jié)果已經(jīng)由元組的第一個(gè)元素決定了叽讳。但是,當(dāng)元組的第一個(gè)元素相同時(shí)坟募,會(huì)比較它們的第二個(gè)元素岛蚤,這是在第二行和第三行代碼中發(fā)生的情況。
只有當(dāng)元組中的每個(gè)元素都可以應(yīng)用運(yùn)算符時(shí)懈糯,元組才能用給定運(yùn)算符進(jìn)行比較涤妒。例如下面的代碼所示,我們可以比較兩個(gè)類型(String赚哗,Int)的元組她紫,因?yàn)镾tring和Int值都可以使用<運(yùn)算符進(jìn)行比較。相反屿储,類型(String犁苏,Bool)的兩個(gè)元組不能用<
運(yùn)算符進(jìn)行比較,因?yàn)?code><運(yùn)算符不能應(yīng)用于Bool值扩所。
("blue", -1) < ("purple", 1) // OK, evaluates to true
("blue", false) < ("purple", true) // Error because < can't compare Boolean values
注意
Swift標(biāo)準(zhǔn)庫包含了用于少于7個(gè)元素的元組比較運(yùn)算符围详。要將元組與七個(gè)或更多元素進(jìn)行比較,必須自己實(shí)現(xiàn)比較運(yùn)算符祖屏。
三元條件運(yùn)算符
三元條件運(yùn)算符是由三部分組成的特殊運(yùn)算符助赞,它的形式是疑問句 ? 答案1 : 答案2
。它是根據(jù)問題是真是假來計(jì)算兩個(gè)表達(dá)式之一的快捷方式袁勺。如果question為true雹食,它計(jì)算answer1并返回其值;否則期丰,它計(jì)算answer2并返回其值群叶。
三元條件運(yùn)算符是以下代碼的簡(jiǎn)寫:
if question {
answer1
} else {
answer2
}
下面是一個(gè)計(jì)算表的行高的示例吃挑。如果行有標(biāo)題,行高應(yīng)比內(nèi)容高50點(diǎn)街立,如果行沒有標(biāo)題舶衬,行高應(yīng)比內(nèi)容高20點(diǎn):
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90
上面的例子是下面代碼的速寫:
let contentHeight = 40
let hasHeader = true
let rowHeight: Int
if hasHeader {
rowHeight = contentHeight + 50
} else {
rowHeight = contentHeight + 20
}
// rowHeight is equal to 90
第一個(gè)示例使用三元條件運(yùn)算符,意味著行高可以在一行代碼上設(shè)置為正確的值赎离,這比第二個(gè)示例中使用的代碼更簡(jiǎn)潔逛犹。
三元條件運(yùn)算符提供了一個(gè)有效的快捷方式,來決定要計(jì)算兩個(gè)表達(dá)式中的哪一個(gè)梁剔。不過虽画,要小心使用三元條件運(yùn)算符。如果過度使用荣病,它的簡(jiǎn)潔性會(huì)導(dǎo)致代碼難以閱讀码撰。我們應(yīng)該避免將三元條件運(yùn)算符的多個(gè)實(shí)例組合到一個(gè)復(fù)合語句中。
nil聚合運(yùn)算符
nil聚合運(yùn)算符(a ?? b)
个盆,如果可選項(xiàng)a包含值灸拍,則將其展開;如果a為nil砾省,則返回默認(rèn)值b鸡岗。表達(dá)式a始終是可選類型。表達(dá)式b必須與存儲(chǔ)在a中的類型匹配编兄。
nil聚合運(yùn)算符是以下代碼的簡(jiǎn)寫:
a != nil ? a! : b
上面的代碼使用三元條件運(yùn)算符和強(qiáng)制展開(a!)
轩性,來在當(dāng)a不為nil時(shí),訪問包裝在a中的值狠鸳,否則當(dāng)a為nil時(shí)揣苏,就返回b。nil聚合運(yùn)算符提供了一種更優(yōu)雅的方式件舵,以簡(jiǎn)潔易讀的形式封裝這種條件檢查和展開卸察。
注意
如果a的值不是nil,則不計(jì)算b的值铅祸。這就是所謂的短路評(píng)估坑质。
下面的示例使用nil聚合運(yùn)算符在默認(rèn)顏色名稱和可選的用戶定義顏色名稱之間進(jìn)行選擇:
let defaultColorName = "red"
var userDefinedColorName: String? // defaults to nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is nil, so colorNameToUse is set to the default of "red"
userDefinedColorName變量定義為可選字符串,默認(rèn)值為nil临梗。因?yàn)?code>userDefinedColorName是可選類型涡扼,所以可以使用nil聚合運(yùn)算符來考慮其值。在上面的示例中盟庞,nil聚合運(yùn)算符用來確定colorNameToUse
這個(gè)字符串變量的初始值吃沪。因?yàn)?code>userDefinedColorName為nil,所以表達(dá)式userDefinedColorName ?? DefaultColorName
返回DefaultColorName
或"red"
的值什猖。
如果將非nil值賦給userDefinedColorName
票彪,并再次執(zhí)行nil聚合運(yùn)算符檢查红淡,則將使用包裝在userDefinedColorName中的值,而不是默認(rèn)值:
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is not nil, so colorNameToUse is set to "green"
范圍運(yùn)算符
Swift包含幾個(gè)范圍運(yùn)算符降铸,它們是表示值范圍的快捷方式在旱。
閉合范圍運(yùn)算符
閉合范圍運(yùn)算符(a…b)
定義從a到b的范圍,并包括值a和b垮耳。a的值不得大于b颈渊。
在要使用所有值的范圍內(nèi)進(jìn)行迭代時(shí)遂黍,閉合范圍運(yùn)算符非常有用终佛,例如for-in
循環(huán):
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
有關(guān)in循環(huán)的更多信息,請(qǐng)參見控制流雾家。
半開范圍運(yùn)算符
半開范圍運(yùn)算符(a…<b)
定義了從a到b的范圍铃彰,但不包括b。它被稱為半開范圍芯咧,因?yàn)樗谝粋€(gè)值牙捉,但不包含最終值。與閉合范圍運(yùn)算符一樣敬飒,a的值不得大于b邪铲。如果a的值等于b,則生成的范圍就為空无拗。
半開范圍在處理從0開始的列表(如數(shù)組)時(shí)特別有用带到,在數(shù)組中,將列表從0計(jì)算到(但不包括)列表的長(zhǎng)度非常有用:
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
請(qǐng)注意英染,數(shù)組包含四個(gè)項(xiàng)揽惹,但0..<count最多只能計(jì)算3(數(shù)組中最后一個(gè)項(xiàng)的索引),因?yàn)樗前腴_范圍四康。有關(guān)數(shù)組的詳細(xì)信息搪搏,請(qǐng)參見數(shù)組。
單邊范圍
閉合范圍運(yùn)算符具有另一種單邊形式闪金,用于在一個(gè)方向上盡量連續(xù)的范圍疯溺,例如,從索引2到數(shù)組結(jié)尾的數(shù)組的所有元素的范圍哎垦。在這些情況下喝检,可以忽略范圍運(yùn)算符一側(cè)的值。這種范圍稱為單邊范圍撼泛,因?yàn)檫\(yùn)算符只有一側(cè)的值挠说。例如:
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
半開范圍操作符也有一個(gè)單邊形式,只寫它的最終值愿题。就像兩邊都包含一個(gè)值一樣损俭,這個(gè)最終值不在包含范圍內(nèi)蛙奖。例如:
for name in names[..<2] {
print(name)
}
// Anna
// Alex
單側(cè)范圍可以在其他上下文中使用,而不僅僅是在下標(biāo)中杆兵。我們不能在忽略第一個(gè)值的這樣的單邊范圍內(nèi)迭代雁仲,因?yàn)檫@樣我們就不清楚迭代應(yīng)該從何處開始。我們可以在忽略其最終值的這樣的單邊范圍上進(jìn)行迭代琐脏;但是攒砖,由于該范圍可能會(huì)無限期地繼續(xù),請(qǐng)確保為循環(huán)添加了顯式結(jié)束條件日裙。我們還可以檢查單邊范圍是否包含特定值吹艇,如下面的代碼所示。
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
邏輯運(yùn)算符
邏輯運(yùn)算符修改或組合布爾邏輯值true和false昂拂。Swift支持C語言中的三種標(biāo)準(zhǔn)邏輯運(yùn)算符:
- 邏輯非(
!a
) - 邏輯與(
a && b
) - 邏輯或(
a || b
)
邏輯非運(yùn)算符
邏輯非運(yùn)算符(!a
) 反轉(zhuǎn)布爾值受神,使true變?yōu)閒alse,false變?yōu)閠rue格侯。
邏輯非運(yùn)算符是一個(gè)前綴運(yùn)算符鼻听,緊跟在它所操作的值之前,沒有任何空格联四〕挪辏可以將其解讀為“非a”,如以下示例所示:
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
如果!allowedEntry
可以讀作“if not allowed entry”朝墩。只有當(dāng)“not allowed entry”為true時(shí)醉拓,即allowedEntry為false時(shí),才執(zhí)行下一行鱼辙。
在本例中廉嚼,仔細(xì)選擇布爾常量和變量名有助于保持代碼可讀性和簡(jiǎn)潔性,同時(shí)避免雙重否定或混淆邏輯語句倒戏。
邏輯與運(yùn)算符
邏輯與運(yùn)算符(a && b
)創(chuàng)建邏輯表達(dá)式怠噪,其中兩個(gè)值都必須為真,整個(gè)表達(dá)式才能為真杜跷。
如果其中一個(gè)值為false傍念,則整個(gè)表達(dá)式也將為false。實(shí)際上葛闷,如果第一個(gè)值為false憋槐,第二個(gè)值甚至不會(huì)被計(jì)算,因?yàn)樗豢赡苁拐麄€(gè)表達(dá)式等于true淑趾。這就是所謂的短路評(píng)估阳仔。
本例考慮兩個(gè)Bool值,僅當(dāng)兩個(gè)值都為真時(shí)才允許訪問:
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
邏輯或運(yùn)算符
邏輯或運(yùn)算符(a || b
)是由兩個(gè)相鄰的管道字符組成的中綴運(yùn)算符扣泊。我們可以使用它來創(chuàng)建邏輯表達(dá)式近范,其中只有兩個(gè)值中的一個(gè)為真嘶摊,整個(gè)表達(dá)式就能為真。
與上面的邏輯“與”運(yùn)算符一樣评矩,邏輯“或”運(yùn)算符使用短路評(píng)估來考慮其表達(dá)式叶堆。如果邏輯或表達(dá)式的左側(cè)為true,則不計(jì)算右側(cè)斥杜,因?yàn)樗荒芨恼麄€(gè)表達(dá)式的結(jié)果虱颗。
在下面的示例中,第一個(gè)Bool值(hasDoorKey)為false蔗喂,但第二個(gè)值(knowsOverridePassword)為true忘渔。因?yàn)槠渲幸粋€(gè)值為true,所以整個(gè)表達(dá)式的計(jì)算結(jié)果也為true弱恒,并且允許訪問:
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
組合邏輯運(yùn)算符
我們可以組合多個(gè)邏輯運(yùn)算符以創(chuàng)建更長(zhǎng)的復(fù)合表達(dá)式:
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
本例使用多個(gè)&&
和||
運(yùn)算符創(chuàng)建較長(zhǎng)的復(fù)合表達(dá)式辨萍。但是棋恼,&&
和||
運(yùn)算符仍然只對(duì)兩個(gè)值進(jìn)行操作返弹,因此這實(shí)際上是三個(gè)較小的表達(dá)式鏈接在一起。這個(gè)例子可以理解為:
如果我們輸入了正確的門代碼并通過了視網(wǎng)膜掃描爪飘,或者我們有一把有效的門鑰匙义起,或者如果我們知道緊急超控密碼,那么允許進(jìn)入师崎。
根據(jù)enteredDoorCode默终、passedRetinaScan和hasDoorKey的值,前兩個(gè)子表達(dá)式為false犁罩。但是齐蔽,knowsOverridePassword是true的,因此整個(gè)復(fù)合表達(dá)式的計(jì)算結(jié)果仍然是true床估。
注意
Swift邏輯運(yùn)算符&&
和||
是左關(guān)聯(lián)的含滴,這意味著具有多個(gè)邏輯運(yùn)算符的復(fù)合表達(dá)式首先計(jì)算最左邊的子表達(dá)式。
顯式括號(hào)
有時(shí)丐巫,在不嚴(yán)格需要括號(hào)的情況下包含括號(hào)是很有用的谈况,這樣可以使復(fù)雜表達(dá)式的所要表達(dá)的意思更易于閱讀。在上面的door access示例中递胧,在復(fù)合表達(dá)式的第一部分周圍添加括號(hào)以明確其意圖非常有用:
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
括號(hào)清楚地表明碑韵,前兩個(gè)值被認(rèn)為是整個(gè)邏輯中一個(gè)單獨(dú)的可能狀態(tài)的一部分。復(fù)合表達(dá)式的輸出并沒有改變缎脾,但總體意圖對(duì)讀者來說更為清晰祝闻。易讀性總是優(yōu)于簡(jiǎn)潔性;我們可以在有助于表達(dá)意圖的地方使用括號(hào)遗菠。