运算符
数据存储在变量中,要对数据进行运算,就需要使用运算符。Scala语言中提供了这几种运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等。
注:实际上,Scala没有传统意义上的运算符。在Scala中,一切皆对象,运算符是定义在对象上的方法。但是为了学习上的方便,我们还在这里称为运算符。
算术运算符如下表所示:
运算符 | 描述 | 说明 |
---|---|---|
+ | 加法运算 | 10 + 3,结果是13 |
- | 减法运算 | 10 - 3,结果是7 |
* | 乘法运算 | 10 * 3,结果是30 |
/ | 除法运算 | 10 / 3,结果是3 |
% | 求余数运算 | 10 % 3,结果是1 |
在scala shell中输入以下示例代码:
// 算术运算符 scala> val a = 7 a: Int = 7 scala> val b = 3 b: Int = 3 scala> a + b res0: Int = 10 scala> a - b res1: Int = 4 scala> a * b res2: Int = 21 scala> a / b res3: Int = 2 scala> a % b res4: Int = 1
关系运算符如下表所示:
运算符 | 描述 | 说明 |
---|---|---|
== | 判断两个值是否相等,结果为true或false | 10 == 3,结果是false |
!= | 判断两个值是否不相等,结果为true或false | 10 != 3,结果是true |
> | 判断左值是否大于右值,结果为true或false | 10 > 3,结果是true |
< | 判断左值是否小于右值,结果为true或false | 10 < 3,结果是false |
>= | 判断左值是否大于等于右值,结果为true或false | 10 >= 3,结果是true |
<= | 判断左值是否小于等于右值,结果为true或false | 10 <= 3,结果是false |
scala> val a = 7 a: Int = 7 scala> val b = 3 b: Int = 3 scala> a == b res5: Boolean = false scala> a != b res6: Boolean = true scala> a > b res7: Boolean = true scala> a < b res8: Boolean = false scala> a >= b res9: Boolean = true scala> a <= b res10: Boolean = false
逻辑运算符如下表所示:
运算符 | 描述 | 说明 |
---|---|---|
&& | 逻辑与运算,结果为true或false | 10>3 && 3>5,结果是false |
|| | 逻辑或运算,结果为true或false | 10>3 || 3>5,结果是true |
! | 逻辑非运算,结果为true或false | !true,结果是false |
scala> true && true res11: Boolean = true scala> true && false res12: Boolean = false scala> false && true res13: Boolean = false scala> false && false res14: Boolean = false scala> true || true res15: Boolean = true scala> true || false res16: Boolean = true scala> false || true res17: Boolean = true scala> false || false res18: Boolean = false scala> !true res19: Boolean = false scala> !false res20: Boolean = true
位运算符如下表所示:
运算符 | 描述 | 说明 |
---|---|---|
& | 按位与运算 | 0 & 1,结果是0 |
| | 按位或运算 | 0 | 1,结果是1 |
~ | 按位取反运算 | ~12,结果是-13;~(-12),结果是11 |
^ | 按位异或运算 | 1^ 1,结果是0 |
<< | 左移位运算 | 2<<2,结果是8 |
>> | 右移位运算 | 4>>2,结果是1 |
>>> | 无符号右移位运算 | 4>>>2,结果是1 |
位运算符在实际中使用较少。
赋值运算符如下表所示:
运算符 | 描述 | 说明 |
---|---|---|
= | 赋值运算,将右边的值赋给左边的变量 | var a = 3,为变量a赋值 |
+= | 将左边变量值与右边值相加后,再赋值给左边的变量 | a += 2,相当于 a = a+2 |
-= | 将左边变量值与右边值相减后,再赋值给左边的变量 | a -= 2,相当于 a = a-2 |
*= | 将左边变量值与右边值相乘后,再赋值给左边的变量 | a *= 2,相当于 a = a*2 |
/= | 将左边变量值与右边值相除后,再赋值给左边的变量 | a /= 2,相当于 a = a/2 |
%= | 将左边变量值与右边值求余后,再赋值给左边的变量 | a %= 2,相当于 a = a%2 |
<<= | 将左边的变量值按位左移位后,再赋值给左边的变量 | a <<= 2,相当于 a = a<<=2 |
>>= | 将左边的变量值按位右移位后,再赋值给左边的变量 | a >>= 2,相当于 a = a>>=2 |
&= | 将左边变量值与右边值按位与后,再赋值给左边的变量 | a &= 2,相当于 a = a&2 |
|= | 将左边变量值与右边值按位或后,再赋值给左边的变量 | a |= 2,相当于 a = a|2 |
^= | 将左边变量值与右边值按位异或后,再赋值给左边的变量 | a ^= 2,相当于 a = a^2 |
scala> var a = 3 // 注意这里。因为是重复赋值运算,所以使用关键字var声明变量 a: Int = 3 scala> a += 2; a res24: Int = 5 scala> a -= 2; a res25: Int = 3 scala> a *= 2; a res26: Int = 6 scala> a /= 2; a res27: Int = 3 scala> a %= 2; a res28: Int = 1 scala> a << 2; a res29: Int = 1 scala> a >> 2; a res30: Int = 1 scala> a <<= 2; a res31: Int = 4 scala> a >>= 2; a res32: Int = 1 scala> a &= 2; a res33: Int = 0 scala> a |= 2; a res34: Int = 2 scala> a ^= 2; a res35: Int = 0
对象相等性比较:在Scala中比较的是值,而不是Java概念中的地址值。请看下面的代码:
scala> ("he" + "llo") == "hello" res33: Boolean = true scala> 1 == 1.0 res34: Boolean = true
要比较2个不同的对象,使用三个等号(===)。
在实际进行计算的时候,经常会多个不同的运算符混合在一起进行运算,这时就需要考虑运算符的优先级问题。运算符优先级取决于所属的运算符组,它会影响算式的的计算。
下表中显示了Scala中不同运算符的优先级:
优先级 | 运算符 | 关联性 |
---|---|---|
1 | () [ ] | 从左到右 |
2 | ! ~ | 从右到左 |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | >> >>> << | 从左到右 |
6 | > >= < <= | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | = += -= *= /= %= >>= <<= &= |= ^= | 从右到左 |