Scala 运算符
Scala 运算符
Section titled “Scala 运算符”Scala 中的运算符(Operators)通常只是带有符号名称的方法。Scala 允许接受一个参数的方法使用中缀表示法(infix notation),使得像 a + b 这样的表达式看起来像标准的运算符用法,但实际上等同于 a.+(b)。
Scala 支持在 Java 或 C++ 等语言中常见的运算符集合,分类如下:
算术运算符:
Section titled “算术运算符:”执行标准的数学计算。主要适用于数值类型(如 Int、Double、Float、Long 等)。
假设 val a = 10, val b = 20:
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | a + b 结果为 30 |
- | 减法 | b - a 结果为 10 |
* | 乘法 | a * b 结果为 200 |
/ | 除法 | b / a 结果为 2 (整数除法) |
% | 取模 (余数) | b % 3 结果为 2 |
- (unary) | 负数(一元) | -a 结果为 -10 |
关系运算符:
Section titled “关系运算符:”比较两个值,结果为 Boolean 类型(true 或 false)。
假设 val a = 10, val b = 20:
| 运算符 | 描述 | 示例 |
|---|---|---|
== | 等于 | a == 10 为真 |
!= | 不等于 | a != b 为真 |
> | 大于 | b > a 为真 |
< | 小于 | a < b 为真 |
>= | 大于或等于 | a >= 10 为真 |
<= | 小于或等于 | b <= 20 为真 |
注意: 在 Scala 中,== 执行的是一种合理的比较(对于值类型进行值比较,对于引用类型调用 equals 方法),这与 Java 中 == 用于对象引用相等性比较不同。在 Scala 中进行引用相等性比较,请使用 eq(例如 ref1 eq ref2)。
逻辑运算符:
Section titled “逻辑运算符:”组合布尔表达式。
假设 val x = true, val y = false:
| 运算符 | 描述 | 示例 |
|---|---|---|
&& | 逻辑与 (短路) | x && y 为假 |
|| | 逻辑或 (短路) | x || y 为真 |
! | 逻辑非 (一元) | !y 为真 |
短路(Short-circuiting)意味着只有在必要时才会评估第二个操作数(例如,在 false && Z 中,Z 永远不会被评估)。
对整数类型(Int、Long、Byte、Short)的单个位进行操作。
假设 val a = 60 (0011 1100),val b = 13 (0000 1101):
| 运算符 | 描述 | 示例 |
|---|---|---|
& | 按位与 | 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 (0000 1111) |
>>> | 逻辑右移 (用零填充) | a >>> 2 结果为 15 (0000 1111);(~a) >>> 2 与 (~a) >> 2 会有所不同 |
赋值运算符:
Section titled “赋值运算符:”用于为可变变量(var)赋值。包括复合赋值运算符。
假设 var x = 5, val y = 3:
| 运算符 | 描述 | 示例 |
|---|---|---|
= | 简单赋值 | x = 10 (x 变为 10) |
+= | 加并赋值 | x += y (等同于 x = x + y, x 变为 8) |
-= | 减并赋值 | x -= y (等同于 x = x - y) |
*= | 乘并赋值 | x *= y (等同于 x = x * y) |
/= | 除并赋值 | x /= y (等同于 x = x / y) |
%= | 取模并赋值 | x %= y (等同于 x = x % y) |
&=, |=, ^= | 按位与/或/异或 并赋值 | x &= y (等同于 x = x & y) |
<<=, >>=, >>>= | 移位并赋值 | x <<= 1 (等同于 x = x << 1) |
运算符优先级:
Section titled “运算符优先级:”决定了表达式中运算符的评估顺序。Scala 的优先级规则通常与 Java/C++ 类似。
简化优先级顺序(从高到低):
Section titled “简化优先级顺序(从高到低):”- 后缀运算符(例如,方法调用
(),选择符.) - 一元运算符(
+、-、!、~) - 乘法类(
*、/、%) - 加法类(
+、-) - 移位(
<<、>>、>>>) - 关系运算符(
<、>、<=、>=) - 相等运算符(
==、!=、eq、ne) - 按位与(
&) - 按位异或(
^) - 按位或(
|) - 逻辑与(
&&) - 逻辑或(
||) - 赋值运算符(
=,+=等)
对于未列出的运算符(例如自定义的符号方法),优先级由运算符名称的首字符决定,其中 *、/、% 等字符的优先级高于 +、-,而 +、- 的优先级又高于比较运算符等。赋值运算符的优先级最低。始终可以使用圆括号 () 来明确控制评估顺序。
示例:val result = 2 + 3 * 4 的结果是 14,因为 * 的优先级高于 +。val result2 = (2 + 3) * 4 的结果是 20。