运算符

数据存储在变量中,要对数据进行运算,就需要使用运算符。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 = += -= *= /= %= >>= <<= &= |= ^= 从右到左

《Flink原理深入与编程实战》