Dart 编程语言教程 - 第一章:Dart 的基本表达式(第二节:操作符)

第二节:操作符

Dart 提供了丰富的操作符,用于执行算术运算、比较、逻辑操作、赋值、类型检查、位操作等。本节将全面介绍 Dart 中的所有操作符,并对每个操作符进行详细解释和示例说明。

1. 算术操作符

算术操作符用于执行数学计算。

操作符描述示例结果
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/除法5 / 22.5
~/整数除法5 ~/ 22
%取余数5 % 21
-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 += ba = a + b
-=减法赋值a -= ba = a - b
*=乘法赋值a *= ba = a * b
/=除法赋值a /= ba = a / b
~/=整数除法赋值a ~/= ba = a ~/ b
%=取余赋值a %= ba = 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 && ba 和 b 都为 true,结果为 true
``逻辑或
!逻辑非!aa 为 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 提供了丰富且灵活的操作符,可以满足各种编程需求。理解并熟练运用这些操作符,将有助于编写更高效、简洁的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljguo2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值