第二节:操作符
Dart 提供了丰富的操作符,用于执行算术运算、比较、逻辑操作、赋值、类型检查、位操作等。本节将全面介绍 Dart 中的所有操作符,并对每个操作符进行详细解释和示例说明。
1. 算术操作符
算术操作符用于执行数学计算。
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 除法 | 5 / 2 | 2.5 |
~/ | 整数除法 | 5 ~/ 2 | 2 |
% | 取余数 | 5 % 2 | 1 |
-expr | 一元负号 | -a | 取反 a 的值 |
示例:
void main() {
int a = 10;
int b = 3;
print(a + b); // 输出: 13
print(a - b); // 输出: 7
print(a * b); // 输出: 30
print(a / b); // 输出: 3.3333333333333335
print(a ~/ b); // 输出: 3
print(a % b); // 输出: 1
print(-a); // 输出: -10
}
2. 赋值操作符
赋值操作符用于将值赋给变量,并支持与算术操作符结合的复合赋值操作。
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a = b | 将 b 赋给 a |
+= | 加法赋值 | a += b | a = a + b |
-= | 减法赋值 | a -= b | a = a - b |
*= | 乘法赋值 | a *= b | a = a * b |
/= | 除法赋值 | a /= b | a = a / b |
~/= | 整数除法赋值 | a ~/= b | a = a ~/ b |
%= | 取余赋值 | a %= b | a = a % b |
??= | 空值赋值 | a ??= b | 如果 a 为 null ,则赋值 b |
示例:
void main() {
int a = 5;
a += 3; // 相当于 a = a + 3
print(a); // 输出: 8
double b = 10.0;
b /= 2; // 相当于 b = b / 2
print(b); // 输出: 5.0
String? name;
name ??= 'Dart'; // 如果 name 为 null,则赋值 'Dart'
print(name); // 输出: Dart
}
3. 比较操作符
比较操作符用于比较两个值,结果为布尔值 true
或 false
。
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
== | 等于 | a == b | 如果 a 等于 b ,则为 true |
!= | 不等于 | a != b | 如果 a 不等于 b ,则为 true |
> | 大于 | a > b | 如果 a 大于 b ,则为 true |
< | 小于 | a < b | 如果 a 小于 b ,则为 true |
>= | 大于等于 | a >= b | 如果 a 大于等于 b ,则为 true |
<= | 小于等于 | a <= b | 如果 a 小于等于 b ,则为 true |
示例:
void main() {
int a = 5;
int b = 3;
print(a == b); // 输出: false
print(a != b); // 输出: true
print(a > b); // 输出: true
print(a < b); // 输出: false
print(a >= b); // 输出: true
print(a <= b); // 输出: false
}
4. 逻辑操作符
逻辑操作符用于连接布尔表达式。
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
&& | 逻辑与 | a && b | a 和 b 都为 true ,结果为 true |
` | ` | 逻辑或 | |
! | 逻辑非 | !a | a 为 true ,结果为 false |
示例:
void main() {
bool a = true;
bool b = false;
print(a && b); // 输出: false
print(a || b); // 输出: true
print(!a); // 输出: false
}
5. 位操作符
位操作符用于对整数类型的二进制位进行操作。
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
& | 按位与 | a & b | 对 a 和 b 的每一位执行与操作 |
` | ` | 按位或 | `a |
^ | 按位异或 | a ^ b | 对 a 和 b 的每一位执行异或操作 |
~expr | 按位取反 | ~a | 对 a 的每一位取反 |
<< | 左移 | a << b | 将 a 的二进制位左移 b 位 |
>> | 右移 | a >> b | 将 a 的二进制位右移 b 位 |
>>> | 无符号右移 | a >>> b | 无符号右移 b 位(Dart 2.14 引入) |
示例:
void main() {
int a = 5; // 二进制:0101
int b = 3; // 二进制:0011
print(a & b); // 输出: 1 (0001)
print(a | b); // 输出: 7 (0111)
print(a ^ b); // 输出: 6 (0110)
print(~a); // 输出: -6 (取反)
print(a << 1); // 输出: 10 (1010)
print(a >> 1); // 输出: 2 (0010)
}
6. 类型测试操作符
类型测试操作符用于检查对象的类型。
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
is | 检查对象是否为指定类型 | a is int | 如果 a 是 int 类型,结果为 true |
is! | 检查对象是否不是指定类型 | a is! String | 如果 a 不是 String 类型,结果为 true |
as | 类型转换 | a as String | 将 a 转换为 String 类型(如果类型不匹配会抛出异常) |
示例:
void main() {
dynamic a = 'Hello';
if (a is String) {
print('a 是字符串');
}
String b = a as String;
print(b); // 输出: Hello
}
7. 条件表达式
条件表达式用于根据条件的真假来选择性地执行代码。
7.1 三元运算符
语法:condition ? expr1 : expr2
当 condition
为 true
时,结果为 expr1
;否则结果为 expr2
。
示例:
void main() {
int a = 5;
String result = (a > 3) ? '大于3' : '小于等于3';
print(result); // 输出: 大于3
}
7.2 空值合并运算符
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
?? | 如果左侧值为 null ,返回右侧值 | a ?? b | 如果 a 为 null ,结果为 b |
??= | 如果变量为 null ,赋值右侧值 | a ??= b | 如果 a 为 null ,则 a = b |
示例:
void main() {
String? name;
String greeting = 'Hello, ' + (name ?? 'Guest');
print(greeting); // 输出: Hello, Guest
name ??= 'Dart';
print(name); // 输出: Dart
}
8. 级联操作符
级联操作符用于对同一个对象连续执行多个操作。
操作符 | 描述 | 示例 |
---|---|---|
.. | 级联操作符 | object..method1()..method2() |
?.. | 空安全级联操作符 | object?..method() |
示例:
class Builder {
int? width;
int? height;
String? color;
void setWidth(int w) => width = w;
void setHeight(int h) => height = h;
void setColor(String c) => color = c;
}
void main() {
Builder builder = Builder()
..setWidth(100)
..setHeight(200)
..setColor('red');
print('宽度: ${builder.width}, 高度: ${builder.height}, 颜色: ${builder.color}');
// 输出: 宽度: 100, 高度: 200, 颜色: red
}
9. 访问操作符
用于访问对象的属性或方法,或调用函数。
操作符 | 描述 | 示例 |
---|---|---|
. | 访问成员 | object.property |
?. | 空安全访问成员 | object?.property |
[] | 访问集合的元素 | list[index] |
?[] | 空安全访问集合的元素 | list?[index] |
() | 调用函数或方法 | function() |
示例:
void main() {
List<int>? numbers;
print(numbers?[0]); // 输出: null,不会抛出异常
numbers = [1, 2, 3];
print(numbers[0]); // 输出: 1
}
10. 扩展操作符
用于在集合中插入另一个集合的所有元素。
操作符 | 描述 | 示例 |
---|---|---|
... | 扩展运算符 | [...list] |
...? | 空安全扩展运算符 | [...?list] |
示例:
void main() {
List<int> list1 = [1, 2, 3];
List<int>? list2;
List<int> combinedList = [0, ...list1, ...?list2];
print(combinedList); // 输出: [0, 1, 2, 3]
}
11. 异步操作符
11.1 await
和 async
用于处理异步操作。
示例:
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return '数据加载完成';
}
void main() async {
print('开始加载');
String data = await fetchData();
print(data); // 输出: 数据加载完成(延迟2秒)
}
11.2 yield
和 yield*
用于生成器函数。
示例:
Stream<int> countStream(int max) async* {
for (int i = 1; i <= max; i++) {
yield i;
}
}
void main() async {
await for (int i in countStream(3)) {
print(i); // 输出: 1 2 3
}
}
12. 操作符重载
Dart 允许在类中重载部分操作符,使其适用于自定义对象。
可重载的操作符包括:
- 算术操作符:
+
、-
、*
、/
、~/
、%
- 比较操作符:
==
、>
、<
、>=
、<=
- 位操作符:
&
、|
、^
、~
、<<
、>>
- 索引操作符:
[]
、[]=
- 一元操作符:
-
、~
示例:
class Vector {
final int x, y;
Vector(this.x, this.y);
// 重载加法操作符
Vector operator +(Vector other) => Vector(x + other.x, y + other.y);
// 重载等于操作符
@override
bool operator ==(Object other) =>
other is Vector && x == other.x && y == other.y;
@override
int get hashCode => x.hashCode ^ y.hashCode;
@override
String toString() => 'Vector(``x, ``y)';
}
void main() {
Vector v1 = Vector(2, 3);
Vector v2 = Vector(4, 5);
Vector v3 = v1 + v2;
print(v3); // 输出: Vector(6, 8)
print(v1 == v2); // 输出: false
}
总结
Dart 提供了丰富且灵活的操作符,可以满足各种编程需求。理解并熟练运用这些操作符,将有助于编写更高效、简洁的代码。