一個(gè)運(yùn)算符是一個(gè)符號(hào),用于告訴編譯器來(lái)執(zhí)行指定的數(shù)學(xué)運(yùn)算和邏輯運(yùn)算。
Scala 含有豐富的內(nèi)置運(yùn)算符,包括以下幾種類(lèi)型:
算術(shù)運(yùn)算符
關(guān)系運(yùn)算符
邏輯運(yùn)算符
位運(yùn)算符
賦值運(yùn)算符
接下來(lái)我們將為大家詳細(xì)介紹以上各種運(yùn)算符的應(yīng)用。
下表列出了 Scala 支持的算術(shù)運(yùn)算符。
假定變量 A 為 10,B 為 20:
| 運(yùn)算符 | 描述 | 示例 |
|---|---|---|
| + | 加號(hào) | A + B 運(yùn)算結(jié)果為 30 |
| - | 減號(hào) | A - B 運(yùn)算結(jié)果為 -10 |
| * | 乘號(hào) | A * B 運(yùn)算結(jié)果為 200 |
| / | 除號(hào) | B / A 運(yùn)算結(jié)果為 2 |
| % | 取余 | B % A 運(yùn)算結(jié)果為 0 |
object Test {
def main(args: Array[String]) {
var a = 10;
var b = 20;
var c = 25;
var d = 25;
println("a + b = " + (a + b) );
println("a - b = " + (a - b) );
println("a * b = " + (a * b) );
println("b / a = " + (b / a) );
println("b % a = " + (b % a) );
println("c % a = " + (c % a) );
}
}執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac Test.scala $ scala Test a + b = 30 a - b = -10 a * b = 200 b / a = 2 b % a = 0 c % a = 5
下表列出了 Scala 支持的關(guān)系運(yùn)算符。
假定變量 A 為 10,B 為 20:
| 運(yùn)算符 | 描述 | 示例 |
|---|---|---|
| == | 等于 | (A == B) 運(yùn)算結(jié)果為 false |
| != | 不等于 | (A != B) 運(yùn)算結(jié)果為 true |
| > | 大于 | (A > B) 運(yùn)算結(jié)果為 false |
| < | 小于 | (A < B) 運(yùn)算結(jié)果為 true |
| >= | 大于等于 | (A >= B) 運(yùn)算結(jié)果為 false |
| <= | 小于等于 | (A <= B) 運(yùn)算結(jié)果為 true |
object Test {
def main(args: Array[String]) {
var a = 10;
var b = 20;
println("a == b = " + (a == b) );
println("a != b = " + (a != b) );
println("a > b = " + (a > b) );
println("a < b = " + (a < b) );
println("b >= a = " + (b >= a) );
println("b <= a = " + (b <= a) );
}
}執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac Test.scala $ scala Test a == b = false a != b = true a > b = false a < b = true b >= a = true b <= a = false
下表列出了 Scala 支持的邏輯運(yùn)算符。
假定變量 A 為 1,B 為 0:
| 運(yùn)算符 | 描述 | 示例 |
|---|---|---|
| && | 邏輯與 | (A && B) 運(yùn)算結(jié)果為 false |
| || | 邏輯或 | (A || B) 運(yùn)算結(jié)果為 true |
| ! | 邏輯非 | !(A && B) 運(yùn)算結(jié)果為 true |
object Test {
def main(args: Array[String]) {
var a = true;
var b = false;
println("a && b = " + (a&&b) );
println("a || b = " + (a||b) );
println("!(a && b) = " + !(a && b) );
}
}執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac Test.scala $ scala Test a && b = false a || b = true !(a && b) = true
位運(yùn)算符用來(lái)對(duì)二進(jìn)制位進(jìn)行操作,~,&,|,^ 分別為取反,按位與與,按位與或,按位與異或運(yùn)算,如下表示例:
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
如果指定 A = 60; 及 B = 13; 兩個(gè)變量對(duì)應(yīng)的二進(jìn)制為:
A = 0011 1100 B = 0000 1101 -------位運(yùn)算---------- A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011
Scala 中的按位運(yùn)算法則如下:
| 運(yùn)算符 | 描述 | 示例 |
|---|---|---|
| & | 按位與運(yùn)算符 | (a & b) 輸出結(jié)果 12 ,二進(jìn)制解釋: 0000 1100 |
| | | 按位或運(yùn)算符 | (a | b) 輸出結(jié)果 61 ,二進(jìn)制解釋: 0011 1101 |
| ^ | 按位異或運(yùn)算符 | (a ^ b) 輸出結(jié)果 49 ,二進(jìn)制解釋: 0011 0001 |
| ~ | 按位取反運(yùn)算符 | (~a ) 輸出結(jié)果 -61 ,二進(jìn)制解釋: 1100 0011, 在一個(gè)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼形式。 |
| << | 左移動(dòng)運(yùn)算符 | a << 2 輸出結(jié)果 240 ,二進(jìn)制解釋: 1111 0000 |
| >> | 右移動(dòng)運(yùn)算符 | a >> 2 輸出結(jié)果 15 ,二進(jìn)制解釋: 0000 1111 |
| >>> | 無(wú)符號(hào)右移 | A >>>2 輸出結(jié)果 15, 二進(jìn)制解釋: 0000 1111 |
object Test {
def main(args: Array[String]) {
var a = 60; /* 60 = 0011 1100 */
var b = 13; /* 13 = 0000 1101 */
var c = 0;
c = a & b; /* 12 = 0000 1100 */
println("a & b = " + c );
c = a | b; /* 61 = 0011 1101 */
println("a | b = " + c );
c = a ^ b; /* 49 = 0011 0001 */
println("a ^ b = " + c );
c = ~a; /* -61 = 1100 0011 */
println("~a = " + c );
c = a << 2; /* 240 = 1111 0000 */
println("a << 2 = " + c );
c = a >> 2; /* 15 = 1111 */
println("a >> 2 = " + c );
c = a >>> 2; /* 15 = 0000 1111 */
println("a >>> 2 = " + c );
}
}執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac Test.scala $ scala Test a & b = 12 a | b = 61 a ^ b = 49 ~a = -61 a << 2 = 240 a >> 2 = 15 a >>> 2 = 15
以下列出了 Scala 語(yǔ)言支持的賦值運(yùn)算符:
| 運(yùn)算符 | 描述 | 示例 |
|---|---|---|
| = | 簡(jiǎn)單的賦值運(yùn)算,指定右邊操作數(shù)賦值給左邊的操作數(shù)。 | C = A + B 將 A + B 的運(yùn)算結(jié)果賦值給 C |
| += | 相加后再賦值,將左右兩邊的操作數(shù)相加后再賦值給左邊的操作數(shù)。 | C += A 相當(dāng)于 C = C + A |
| -= | 相減后再賦值,將左右兩邊的操作數(shù)相減后再賦值給左邊的操作數(shù)。 | C -= A 相當(dāng)于 C = C - A |
| *= | 相乘后再賦值,將左右兩邊的操作數(shù)相乘后再賦值給左邊的操作數(shù)。 | C *= A 相當(dāng)于 C = C * A |
| /= | 相除后再賦值,將左右兩邊的操作數(shù)相除后再賦值給左邊的操作數(shù)。 | C /= A 相當(dāng)于 C = C / A |
| %= | 求余后再賦值,將左右兩邊的操作數(shù)求余后再賦值給左邊的操作數(shù)。 | C %= A is equivalent to C = C % A |
| <<= | 按位左移后再賦值 | C <<= 2 相當(dāng)于 C = C << 2 |
| >>= | 按位右移后再賦值 | C >>= 2 相當(dāng)于 C = C >> 2 |
| &= | 按位與運(yùn)算后賦值 | C &= 2 相當(dāng)于 C = C & 2 |
| ^= | 按位異或運(yùn)算符后再賦值 | C ^= 2 相當(dāng)于 C = C ^ 2 |
| |= | 按位或運(yùn)算后再賦值 | C |= 2 相當(dāng)于 C = C | 2 |
object Test {
def main(args: Array[String]) {
var a = 10;
var b = 20;
var c = 0;
c = a + b;
println("c = a + b = " + c );
c += a ;
println("c += a = " + c );
c -= a ;
println("c -= a = " + c );
c *= a ;
println("c *= a = " + c );
a = 10;
c = 15;
c /= a ;
println("c /= a = " + c );
a = 10;
c = 15;
c %= a ;
println("c %= a = " + c );
c <<= 2 ;
println("c <<= 2 = " + c );
c >>= 2 ;
println("c >>= 2 = " + c );
c >>= a ;
println("c >>= a = " + c );
c &= a ;
println("c &= 2 = " + c );
c ^= a ;
println("c ^= a = " + c );
c |= a ;
println("c |= a = " + c );
}
}執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac Test.scala $ scala Test c = a + b = 30 c += a = 40 c -= a = 30 c *= a = 300 c /= a = 1 c %= a = 5 c <<= 2 = 20 c >>= 2 = 5 c >>= a = 0 c &= 2 = 0 c ^= a = 10 c |= a = 10
運(yùn)算符優(yōu)先級(jí)取決于所屬的運(yùn)算符組,它會(huì)影響算式的的計(jì)算。
示例: x = 7 + 3 * 2; 這里, x 計(jì)算結(jié)果為 13, 而不是 20,因?yàn)槌朔ǎ?) 高于加法(+), 所以它先計(jì)算 3*2 再加上 7。
查看以下表格,優(yōu)先級(jí)從上到下依次遞減,最上面具有最高的優(yōu)先級(jí),逗號(hào)操作符具有最低的優(yōu)先級(jí)。
| 類(lèi)別 | 運(yùn)算符 | 關(guān)聯(lián)性 |
|---|---|---|
| 1 | () [] | 左到右 |
| 2 | ! ~ | 右到左 |
| 3 | * / % | 左到右 |
| 4 | + - | 左到右 |
| 5 | >> >>> << | 左到右 |
| 6 | > >= < <= | 左到右 |
| 7 | == != | 左到右 |
| 8 | & | 左到右 |
| 9 | ^ | 左到右 |
| 10 | | | 左到右 |
| 11 | && | 左到右 |
| 12 | || | 左到右 |
| 13 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
| 14 | , | 左到右 |