Scala 运算符
操作符是告诉编译器执行特定的数学或逻辑操作的符号。Scala内置了丰富的操作符类型,包括以下几种:
本章将逐一讨论算术、关系、逻辑、位、赋值以及其他操作符。
算术运算符
Scala语言支持以下算术运算符。例如,假设变量A的值为10,变量B的值为20,则有:
显示示例
操作符 | 描述 | 示例 |
---|---|---|
+ |
将两个操作数相加 | A + B 将得到30 |
- |
从第一个操作数中减去第二个操作数 | A - B 将得到-10 |
* |
将两个操作数相乘 | A * B 将得到200 |
/ |
将分子除以分母 | B / A 将得到2 |
% |
模运算符,找到一个数被另一个数除后的余数 | B % A 将得到0 |
关系运算符
以下关系运算符是Scala语言支持的。例如,假设变量A的值为10,变量B的值为20,则 –
显示示例
操作符 | 描述 | 示例 |
---|---|---|
== |
检查两个操作数的值是否相等,如果相等,则条件为真。 | (A == B) 不为真。 |
!= |
检查两个操作数的值是否不相等,如果不相等,则条件为真。 | (A != B) 为真。 |
> |
检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 | (A > B) 不为真。 |
< |
检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 | (A < B) 为真。 |
>= |
检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 | (A >= B) 不为真。 |
<= |
检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 | (A <= B) 为真。 |
逻辑运算符
Scala语言支持以下逻辑运算符。例如,假设变量A保存1,变量B保存0,则 −
显示示例
运算符 | 描述 | 示例 |
---|---|---|
&& |
称为“逻辑与”运算符。如果两个操作数都是非零,则条件为真。 | (A && B) 为假。 |
|| |
称为“逻辑或”运算符。如果两个操作数中的任意一个是非零,则条件为真。 | (A || B) 为真。 |
! |
称为“逻辑非”运算符。用于反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假。 | !(A && B) 为真。 |
位运算符
位运算符对位进行操作,并逐位进行操作。 &
,|
和 ^
的真值表如下−
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;现在以二进制格式表示,它们将如下所示−
A = 0011 1100
B = 0000 1101
-----------------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
Scala语言支持的按位运算符如下表所示。假设变量A保存了60,变量B保存了13,则−
展示示例
运算符 | 描述 | 示例 |
---|---|---|
& |
二进制与运算符,如果两个操作数都存在相同的位,则将该位复制到结果中。 | (A & B) 将得到12,即 0000 1100 |
| |
二进制或运算符,如果任一操作数中存在该位,则将该位复制到结果中。 | (A | B) 将得到61,即 0011 1101 |
^ |
二进制异或运算符,如果一个操作数中设置了该位而另一个操作数中未设置该位,则将该位复制到结果中。 | (A ^ B) 将得到49,即 0011 0001 |
~ |
二进制一补运算符是一元运算符,效果是“翻转”位。 | (~A) 将得到-61,即 1100 0011,这是补码形式的带符号二进制数。 |
<< |
二进制左移运算符,左操作数的位位置向左移动右操作数指定的位数。 | A << 2 将得到240,即 1111 0000 |
>> |
二进制右移运算符,左操作数的位位置向右移动右操作数指定的位数。 | A >> 2 将得到15,即 1111 |
>>> |
无符号右移零填充运算符,左操作数的位位置向右移动右操作数指定的位数,并用零填充移出的位的值。 | A >>> 2 将得到15,即 0000 1111 |
赋值运算符
Scala语言支持以下赋值运算符:
显示示例
运算符 | 描述 | 示例 |
---|---|---|
= |
简单赋值运算符,将右侧操作数的值赋给左侧操作数 | C = A + B 将 A + B 的值赋给 C |
+= |
加并赋值运算符,将右操作数加到左操作数并将结果赋给左操作数 | C += A 等同于 C = C + A |
-= |
减并赋值运算符,将右操作数从左操作数中减去并将结果赋给左操作数 | C -= A 等同于 C = C – A |
*= |
乘并赋值运算符,将右操作数乘以左操作数并将结果赋给左操作数 | C *= A 等同于 C = C * A |
/= |
除并赋值运算符,将左操作数除以右操作数并将结果赋给左操作数 | C /= A 等同于 C = C / A |
%= |
取余并赋值运算符,使用两个操作数取模并将结果赋给左操作数 | C %= A 等同于 C = C % A |
<<= |
左移并赋值运算符 | C <<= 2 相当于 C = C << 2 |
>>= |
右移并赋值运算符 | C >>= 2 相当于 C = C >> 2 |
&= |
位与并赋值运算符 | C &= 2 相当于 C = C & 2 |
^= |
位异或并赋值运算符 | C ^= 2 相当于 C = C ^ 2 |
|= |
位或并赋值运算符 | C |= 2 相当于 C = C | 2 |
Scala运算符优先级
运算符优先级确定表达式中项的分组方式。这影响了表达式的计算顺序。某些运算符的优先级比其他运算符高;例如,乘法运算符的优先级高于加法运算符-
例如,x = 7 + 3 * 2
; 在这里,x被赋值为13,而不是20,因为乘法运算符*
的优先级高于加法运算符+,所以它首先与3*2
相乘,然后再加到7中。
请参考以下表格。优先级最高的运算符位于表格顶部,优先级最低的运算符位于表格底部。在一个表达式中,优先级较高的运算符会先被计算。
类别 | 操作符 | 结合性 |
---|---|---|
后缀 | () [] |
从左到右 |
一元 | ! ~ |
从右到左 |
乘性 | * / % |
从左到右 |
加性 | + - |
从左到右 |
移位 | >> >>> << |
从左到右 |
关系 | > >= < <= |
从左到右 |
相等 | == != |
从左到右 |
位与 | & |
从左到右 |
位异或 | ^ |
从左到右 |
位或 | | |
从左到右 |
逻辑与 | && |
从左到右 |
逻辑或 | || |
从左到右 |
赋值 | = += -= *= /= %= >>= <<= &= ^= |= |
从右到左 |
逗号 | , |
从左到右 |