Groovy(五)-算術(shù)運算符赖条,關(guān)系運算符失乾,邏輯運算符,位運算符

譯文:Groovy Language Documentation

算術(shù)運算符
Groovy支持在數(shù)學(xué)和其他語言如java中一些常見的算術(shù)運算符纬乍,所有java的算術(shù)運算符都是支持的碱茁。在下面的例子中我們會一一來看。

通常的算術(shù)運算符
下面這些二元運算符在groovy中是有效的:

二元運算符

下面是一些運算符的應(yīng)用:

assert  1  + 2 == 3
assert  4  - 3 == 1
assert  3  * 5 == 15
assert  3  / 2 == 1.5
assert 10  % 3 == 1
assert  2 ** 3 == 8

一元運算符
+-也可以作為一元運算符

assert +3 == 3
assert -4 == 0 - 4

assert -(-1) == 1           1

1.將一元負號應(yīng)用到被括號包圍的表達式中

就一元算術(shù)運算符而言仿贬,++(自增)和--(自減)都是支持的纽竣。放前面和后面都是可以的。

def a = 2
def b = a++ * 3             1

assert a == 3 && b == 6

def c = 3
def d = c-- * 2             2

assert c == 2 && d == 6

def e = 1
def f = ++e + 3             3

assert e == 2 && f == 5

def g = 4
def h = --g + 1             4

assert g == 3 && h == 4

1.當(dāng)表達式計算完畢,后置自增運算符會使a增加1蜓氨,然后表達式計算完畢賦值給b聋袋。
2.當(dāng)表達式計算完畢,后置自減運算符會使c減少1穴吹,然后表達式計算完畢賦值給d幽勒。
3.當(dāng)表達式計算之前,前置自增運算符會使e增加1港令,然后表達式計算完畢賦值給f啥容。
4.當(dāng)表達式計算之前,前置自減運算符會使g減少1顷霹,然后表達式計算完畢賦值給h咪惠。

賦值算術(shù)運算符
之前我們看到的二元運算符在賦值形式中也是適用的:

  • +=
  • -=
  • *=
  • /=
  • %=
  • **=
    讓我們看看是怎么用的:
def a = 4
a += 3

assert a == 7

def b = 5
b -= 3

assert b == 2

def c = 5
c *= 3

assert c == 15

def d = 10
d /= 2

assert d == 5

def e = 10
e %= 3

assert e == 1

def f = 3
f **= 2

assert f == 9

關(guān)系運算符
關(guān)系運算符允許你比較兩個對象,來知道這個對象是不是同一個淋淀∠醴辏或者是大于,小于或者等于绅喉。

下面是支持的運算符:


關(guān)系運算符

下面是一些使用關(guān)系運算符的數(shù)字比較:

assert 1 + 2 == 3
assert 3 != 4

assert -2 < 3
assert 2 <= 2
assert 3 <= 4

assert 5 > 1
assert 5 >= -2

邏輯運算符
Groovy提供了下面幾種邏輯運算符來給boolean表達式使用:

  • &&:邏輯與
  • ||:邏輯或
  • !:邏輯非

下面例子來說明一下:

assert !false           1
assert true && true     2
assert true || false    3

1.非false就是true
2.true和true與運算得到還是true
3.true和false或運算的到是true

優(yōu)先級
邏輯非比邏輯與優(yōu)先級更高

assert (!false && false) == false

注意:這里的斷言返回的是true(因為括號里面的表達式返回是true)渠鸽,因為非比與優(yōu)先級更高,所以它會先運行第一個false的非運算柴罐,然后再將結(jié)果跟后面的false進行與運算徽缚,把結(jié)果變成false,這樣斷言的結(jié)果就會是true革屠。

邏輯與比邏輯或優(yōu)先級更高:

assert true || true && false

注意:這里斷言的結(jié)果是true凿试,因為邏輯與比邏輯或有更高的優(yōu)先級,所以如果有一個返回為true的結(jié)果最后進行或運算就會返回為true似芝,但是只要有一個返回為false的結(jié)果最后進行與運算就會返回false那婉,斷言就會失敗。

短路運算
邏輯與||支持段路運算党瓮,如果左邊運算返回true详炬,那么它知道不管后面結(jié)果怎樣肯定都是true,那么它就不會計算右邊運算寞奸。如果左邊運算返回false才會計算呛谜。

同樣地,邏輯與運算&&:如果左邊運算返回false枪萄,那么不管右邊結(jié)果返回什么都是false隐岛,它就不會計算右邊的運算。只有左邊返回為true的情況才會計算右邊的運算瓷翻。

boolean checkIfCalled() {   1
    called = true
}

called = false
true || checkIfCalled()
assert !called              2

called = false
false || checkIfCalled()
assert called               3

called = false
false && checkIfCalled()
assert !called              4

called = false
true && checkIfCalled()
assert called               5

1.創(chuàng)建一個函數(shù)設(shè)置called標記為true聚凹,不管他在哪里被調(diào)用割坠。
2.在這個例子中,我們看最后有沒有重新設(shè)置了標記來判斷有沒有進行短路運算妒牙。這里我們將左邊設(shè)置為了true韭脊,這個函數(shù)就不會被調(diào)用,因為||短路運算的緣故单旁,所以返回的called標記還是false沪羔。
3.在這個例子中,因為左邊為false象浑,所以這個函數(shù)會被調(diào)用蔫饰,修改了called標識的值,結(jié)果就會是called值為true愉豺。
4.同樣地篓吁,&&與運算的左邊為false的時候,右邊就不會計算蚪拦,因為短路的緣故杖剪。
5.如果左邊為true的時候,右邊的函數(shù)就會被調(diào)用驰贷。

位運算
Groovy支持四種位運算:

  • &:位與
  • |:位或
  • ^:位異或
  • ~:位反
    位運算可以應(yīng)用在byte或者int盛嘿,然后返回int:
int a = 0b00101010
assert a == 42
int b = 0b00001000
assert b == 8
assert (a & a) == a                     1
assert (a & b) == b                     2
assert (a | a) == a                     3
assert (a | b) == a                     4

int mask = 0b11111111                   5
assert ((a ^ a) & mask) == 0b00000000   6
assert ((a ^ b) & mask) == 0b00100010   7
assert ((~a) & mask)    == 0b11010101   8

1.位與
2.位與返回普通字節(jié)串
3.位或
4.位或返回都是1的字節(jié)串
5.設(shè)置mask來檢查后面八位字節(jié)
6.對于自己異或返回0
7.位異或
8.位反

值得注意的是內(nèi)部的基本類型表現(xiàn)是遵循java語言規(guī)范的,特別是基本類型有正負之分時括袒,使用位反特別管用次兆。而且使用mask來取需要的字節(jié)是非常有效的辦法。

在Groovy中锹锰,位運算是可以重載的芥炭,所以你可以將這些運算符應(yīng)用于所有的對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恃慧,一起剝皮案震驚了整個濱河市园蝠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痢士,老刑警劉巖彪薛,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異良瞧,居然都是意外死亡陪汽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門褥蚯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人况增,你說我怎么就攤上這事赞庶。” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵歧强,是天一觀的道長澜薄。 經(jīng)常有香客問我,道長摊册,這世上最難降的妖魔是什么肤京? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮茅特,結(jié)果婚禮上忘分,老公的妹妹穿的比我還像新娘。我一直安慰自己白修,他們只是感情好妒峦,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兵睛,像睡著了一般肯骇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祖很,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天笛丙,我揣著相機與錄音,去河邊找鬼假颇。 笑死若债,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拆融。 我是一名探鬼主播蠢琳,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镜豹!你這毒婦竟也來了傲须?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤趟脂,失蹤者是張志新(化名)和其女友劉穎泰讽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔期,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡已卸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硼一。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片累澡。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖般贼,靈堂內(nèi)的尸體忽然破棺而出愧哟,到底是詐尸還是另有隱情奥吩,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布蕊梧,位于F島的核電站霞赫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肥矢。R本人自食惡果不足惜端衰,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甘改。 院中可真熱鬧旅东,春花似錦、人聲如沸楼誓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疟羹。三九已至主守,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榄融,已是汗流浹背参淫。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愧杯,地道東北人涎才。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像力九,于是被迫代替她去往敵國和親耍铜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361