Dart支持下表所示的操作符:
描述 | 运算符 |
一元后缀 | expr++ expr-- () [] ?[] . ?. ! |
一元前缀 | -expr !expr ~expr ++expr --expr await expr |
乘、除、求模、整除 | * / % ~/ |
加减 | + - |
移位 | << >> >>> |
位与 | & |
位异或 | ^ |
位或 | | |
关系测试和类型测试 | >= > <= < as is is! |
相等性 | == != |
逻辑关系(和) | && |
逻辑关系(或) | || |
如果是null | ?? |
条件语句 | expr1 ? expr2 : expr3 |
级联 | .. ?.. |
赋值 | = *= /= += -= &= ^= etc. |
运算符 | 描述 |
+ | 加 |
- | 减 |
-expr | 一元减号,也称为否定号(将表达式的符号颠倒) |
* | 乘 |
/ | 除 |
~/ | 整除, 返回一个整数结果 |
% | 整数除法(取模)的余数 |
代码演示:
assert(2 + 3 == 5);assert(2 - 3 == -1);assert(2 * 3 == 6);assert(5 / 2 == 2.5); // 结果是 doubleassert(5 ~/ 2 == 2); // 整除---结果是 intassert(5 % 2 == 1); // 求模--结果是余数assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
操作符 | 描述 |
++var | var = var + 1 (表达式的值是 var + 1) |
var++ | var = var + 1 (表达式的值是 var) |
--var | var = var - 1 (表达式的值是 var - 1) |
var-- | var = var - 1 (表达式的值是 var) |
代码演示:
int a;int b;a = 0;b = ++a; // 在b得到它的值之前a+1assert(a == b); // 1 == 1a = 0;b = a++; // 在b得到它的值后a+1assert(a != b); // 1 != 0a = 0;b = --a; // 在b得到它的值之前a-1assert(a == b); // -1 == -1a = 0;b = a--; // 在b得到它的值后a-1assert(a != b); // -1 != 0
运算符 | 描述 |
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
代码演示:
assert(2 == 2);assert(2 != 3);assert(3 > 2);assert(2 < 3);assert(3 >= 3);assert(2 <= 3);
运算符 | 描述 |
as | 类型转换(也用于指定库前缀) |
is | 如果对象是指定的类型,则为true |
is! | 如果对象不是指定的类型,则为true |
= | *= | %= | >>>= | ^= |
+= | /= | <<= | &= | |= |
-= | ~/= | >>= | ??= |
可以使用=操作符赋值。仅当赋值变量为null时才进行赋值,使用??=运算符。
代码演示:
// 将一个value值赋值给aa = value;// 如果b为空,赋值给b; 否则,b保持不变b ??= value;
复合赋值 | 等效式 | |
操作符op: | a op= b | a = a op b |
示例: | a += b | a = a + b |
代码演示:
var a = 2; a *= 3; // a = a * 3assert(a == 6);
运算符 | 描述 |
!expr | 反转表达式的值(将false改为true,或将true改为false) |
|| | 逻辑关系(或) |
&& | 逻辑关系(和) |
代码演示:
if (!done() && (col == 0 || col == 3)) { // ..Todo...}
操作符 | 描述 |
& | 与 |
| | 或 |
^ | 异或 |
~expr | 一元位补码(0变成1;1变成0) |
<< | 左移 |
>> | 右移 |
>>> | 无符号右移 |
>>>运算符(称为三重移位或无符号移位)要求语言版本至少为2.14
代码演示:
final value = 0x22;final bitmask = 0x0f;assert((value & bitmask) == 0x02); // 与assert((value & ~bitmask) == 0x20); // 与非assert((value | bitmask) == 0x2f); // 或assert((value ^ bitmask) == 0x2d); // 异或assert((value << 4) == 0x220); // 左移assert((value >> 4) == 0x02); // 右移assert((value >>> 4) == 0x02); // 无符号右移assert((-value >> 4) == -0x03); // 右移动assert((-value >>> 4) > 0); // 无符号右移
Dart有两个操作符,可以简化if-else语句的表达式。
表达式 | 描述 |
condition ? expr1 : expr2 | 如果condition为真,计算expr1(并返回其值); 否则,计算并返回expr2的值。 |
expr1 ?? expr2 | 如果expr1非空,返回其值;否则,计算并返回expr2的值。 |
代码演示:
var visibility = isPublic ? 'public' : 'private'String playerName(String? name) => name ?? 'Guest';
级联(. ., ?..)允许你在同一个对象上进行一系列操作。除了访问实例成员之外,还可以调用同一对象上的实例方法。这通常省去了创建临时变量的步骤,并允许您编写更流畅的代码。
代码演示:
var paint = Paint() ..color = Colors.black ..strokeCap = StrokeCap.round ..strokeWidth = 5.0;
以上代码相当于进行了如下操作:
var paint = Paint();paint.color = Colors.black;paint.strokeCap = StrokeCap.round;paint.strokeWidth = 5.0;
如果级联操作的对象可以为空,那么对第一个操作使用空级联(?..)。保证不会在空对象上尝试任何级联操作。
querySelector('#confirm') // 获取一个对象 ?..text = 'Confirm' // 使用它的成员 ..classes.add('important') ..onClick.listen((e) => window.alert('Confirmed!')) ..scrollIntoView();
以上代码相当于进行了如下操作:
var button = querySelector('#confirm');button?.text = 'Confirm';button?.classes.add('important');button?.onClick.listen((e) => window.alert('Confirmed!'));button?.scrollIntoView();
也可以嵌套使用级联操作,例如:
final addressBook = (AddressBookBuilder() ..name = 'jenny' ..email = 'jenny@example.com' ..phone = (PhoneNumberBuilder() ..number = '415-555-0100' ..label = 'home') .build()) .build();
操作符 | 名称 | 描述 |
() | 函数 | 表示一个函数调用。 |
[] | 根据下标访问数组元素 | 例如: list[1]获取list元素位置为1的值 |
?[] | 条件下标访问 | 与[] 类似,但是会先判断list是否为空 |
. | 成员访问 | 访问类的成员 |
?. | 条件成员访问 | 与.类似,但是先判断对象实例是否为空 |
! | 非空断言 | 将表达式强制转换为其基础的非空类型,如果强制转换失败,则抛出运行时异常 |
留言与评论(共有 0 条评论) “” |