算術(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)系運算符的數(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)用于所有的對象。