Skip to content

操作符

操作符是对操作数执行操作的特殊符号。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

操作符优先级

从高到低:

  1. 后缀:expr++expr--()[].?.
  2. 一元前缀:-expr!expr~expr++expr--expr
  3. 乘法:*/%~/
  4. 加法:+-
  5. 移位:<<>>
  6. 位与:&
  7. 位异或:^
  8. 位或:|
  9. 关系:>=><=<asisis!
  10. 相等:==!=
  11. 逻辑与:&&
  12. 逻辑或:||
  13. 空值感知:??
  14. 条件:expr1 ? expr2 : expr3
  15. 级联:..?..
  16. 赋值:=*=/=+=-=

操作符重载

你可以在自定义类中重载操作符:

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)
}

最佳实践

  1. 使用括号使复杂表达式更清晰
  2. **在提供默认值时优先使用 ??**而不是显式空值检查
  3. 对同一对象的多个操作使用级联表示法
  4. 谨慎使用 ! - 仅在确定值不为空时使用
  5. 使用 ?. 安全导航可能为空的对象

完整示例

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]
}

下一步