第二节:操作符
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.33335 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 提供了丰富且灵活的操作符,可以满足各种编程需求。理解并熟练运用这些操作符,将有助于编写更高效、简洁的代码。
到此这篇dart语言怎么样_主流编程语言的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/2182.html