操作符
操作符是对操作数执行操作的特殊符号。Dart 支持丰富的操作符集合用于各种操作。
算术操作符
dart
int a = 10, b = 3;
print(a + b); // 13 - 加法
print(a - b); // 7 - 减法
print(a * b); // 30 - 乘法
print(a / b); // 3.333... - 除法(返回 double)
print(a ~/ b); // 3 - 整数除法
print(a % b); // 1 - 取模(余数)
// 一元操作符
print(-a); // -10 - 取反自增和自减
dart
int x = 5;
print(++x); // 6 - 前置自增(先增后返回)
print(x++); // 6 - 后置自增(先返回后增)
print(x); // 7
print(--x); // 6 - 前置自减
print(x--); // 6 - 后置自减
print(x); // 5相等和关系操作符
dart
int a = 10, b = 20;
print(a == b); // false - 等于
print(a != b); // true - 不等于
print(a > b); // false - 大于
print(a < b); // true - 小于
print(a >= b); // false - 大于或等于
print(a <= b); // true - 小于或等于逻辑操作符
dart
bool a = true, b = false;
print(a && b); // false - 与
print(a || b); // true - 或
print(!a); // false - 非赋值操作符
dart
int a = 10;
a += 5; // a = a + 5 (15)
a -= 3; // a = a - 3 (12)
a *= 2; // a = a * 2 (24)
a ~/= 4; // a = a ~/ 4 (6)
a %= 4; // a = a % 4 (2)类型测试操作符
dart
var value = '你好';
print(value is String); // true
print(value is! int); // true
print(value is Object); // true
// 类型转换
dynamic obj = '你好';
String str = obj as String; // 转换为 String位操作符
dart
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) - 右移条件表达式
三元运算符
dart
int age = 18;
String status = age >= 18 ? '成年人' : '未成年人';
print(status); // 成年人空值合并运算符
dart
String? name;
String displayName = name ?? '访客';
print(displayName); // 访客
// 如果为空则赋值
name ??= '默认';
print(name); // 默认级联表示法
允许你对同一对象执行一系列操作:
dart
class Person {
String? name;
int? age;
void introduce() {
print('我是 $name,$age 岁');
}
}
void main() {
Person person = Person()
..name = 'Alice'
..age = 25
..introduce(); // 我是 Alice,25 岁
// 空值感知级联
Person? nullablePerson;
nullablePerson?..name = 'Bob'..age = 30;
}展开运算符
dart
List<int> list1 = [1, 2, 3];
List<int> list2 = [4, 5, 6];
// 展开运算符
List<int> combined = [...list1, ...list2];
print(combined); // [1, 2, 3, 4, 5, 6]
// 空值感知展开
List<int>? nullableList;
List<int> safe = [...?nullableList, 7, 8];
print(safe); // [7, 8]空值感知操作符
空值感知访问
dart
class Person {
String? name;
}
Person? person;
// 安全导航
print(person?.name); // null(无错误)
// 链式调用
print(person?.name?.length); // null空值感知赋值
dart
String? name;
name ??= '默认'; // 仅在为空时赋值
print(name); // 默认
name ??= '另一个'; // 不会赋值(name 不为空)
print(name); // 默认空值断言
dart
String? nullable = '你好';
String nonNull = nullable!; // 断言非空
print(nonNull); // 你好
// 如果为空则抛出错误
String? nullValue;
// String error = nullValue!; // 错误:在空值上使用了空值检查操作符索引操作符
dart
List<int> numbers = [10, 20, 30, 40];
print(numbers[0]); // 10
print(numbers[2]); // 30
Map<String, int> ages = {'Alice': 25, 'Bob': 30};
print(ages['Alice']); // 25操作符优先级
从高到低:
- 后缀:
expr++、expr--、()、[]、.、?. - 一元前缀:
-expr、!expr、~expr、++expr、--expr - 乘法:
*、/、%、~/ - 加法:
+、- - 移位:
<<、>> - 位与:
& - 位异或:
^ - 位或:
| - 关系:
>=、>、<=、<、as、is、is! - 相等:
==、!= - 逻辑与:
&& - 逻辑或:
|| - 空值感知:
?? - 条件:
expr1 ? expr2 : expr3 - 级联:
..、?.. - 赋值:
=、*=、/=、+=、-=等
操作符重载
你可以在自定义类中重载操作符:
dart
class Vector {
final double x, y;
Vector(this.x, this.y);
// 重载 + 操作符
Vector operator +(Vector other) {
return Vector(x + other.x, y + other.y);
}
// 重载 - 操作符
Vector operator -(Vector other) {
return Vector(x - other.x, y - other.y);
}
// 重载 * 操作符(标量乘法)
Vector operator *(double scalar) {
return Vector(x * scalar, y * scalar);
}
@override
String toString() => 'Vector($x, $y)';
}
void main() {
Vector v1 = Vector(3, 4);
Vector v2 = Vector(1, 2);
print(v1 + v2); // Vector(4.0, 6.0)
print(v1 - v2); // Vector(2.0, 2.0)
print(v1 * 2); // Vector(6.0, 8.0)
}最佳实践
- 使用括号使复杂表达式更清晰
- **在提供默认值时优先使用
??**而不是显式空值检查 - 对同一对象的多个操作使用级联表示法
- 谨慎使用
!- 仅在确定值不为空时使用 - 使用
?.安全导航可能为空的对象
完整示例
dart
class Calculator {
double? lastResult;
double calculate(double a, double b, String operator) {
lastResult = switch (operator) {
'+' => a + b,
'-' => a - b,
'*' => a * b,
'/' => b != 0 ? a / b : 0,
_ => 0,
};
return lastResult!;
}
void reset() => lastResult = null;
}
void main() {
Calculator calc = Calculator()
..calculate(10, 5, '+')
..calculate(20, 4, '*');
print('最后结果:${calc.lastResult}'); // 80.0
// 空值感知操作
String? input;
String display = input ?? '无输入';
print(display); // 无输入
// 条件表达式
int age = 25;
String category = age >= 18 ? '成年人' : '未成年人';
print('类别:$category'); // 成年人
// 展开运算符
List<int> numbers1 = [1, 2, 3];
List<int> numbers2 = [4, 5, 6];
List<int> all = [...numbers1, ...numbers2];
print('所有数字:$all'); // [1, 2, 3, 4, 5, 6]
}