Skip to content

Scala 运算符

Scala 中的运算符(Operators)通常只是带有符号名称的方法。Scala 允许接受一个参数的方法使用中缀表示法(infix notation),使得像 a + b 这样的表达式看起来像标准的运算符用法,但实际上等同于 a.+(b)。

Scala 支持在 Java 或 C++ 等语言中常见的运算符集合,分类如下:

执行标准的数学计算。主要适用于数值类型(如 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

比较两个值,结果为 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)。

组合布尔表达式。

假设 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 会有所不同

用于为可变变量(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)

决定了表达式中运算符的评估顺序。Scala 的优先级规则通常与 Java/C++ 类似。

简化优先级顺序(从高到低):

Section titled “简化优先级顺序(从高到低):”
  1. 后缀运算符(例如,方法调用 (),选择符 .)
  2. 一元运算符(+、-、!、~)
  3. 乘法类(*、/、%)
  4. 加法类(+、-)
  5. 移位(<<、>>、>>>)
  6. 关系运算符(<、>、<=、>=)
  7. 相等运算符(==、!=、eq、ne)
  8. 按位与(&)
  9. 按位异或(^)
  10. 按位或(|)
  11. 逻辑与(&&)
  12. 逻辑或(||)
  13. 赋值运算符(=, += 等)

对于未列出的运算符(例如自定义的符号方法),优先级由运算符名称的首字符决定,其中 *、/、% 等字符的优先级高于 +、-,而 +、- 的优先级又高于比较运算符等。赋值运算符的优先级最低。始终可以使用圆括号 () 来明确控制评估顺序。

示例:val result = 2 + 3 * 4 的结果是 14,因为 * 的优先级高于 +。val result2 = (2 + 3) * 4 的结果是 20。