按照运算符优先级高低进行排序

描述 操作符
一元后置操作符 expr++    expr—    ()    []    .    ?.
一元前置操作符 -expr    !expr    ~expr    ++expr    —expr
乘除运算 *    /    %    ~/
加减运算 +    -
移位运算 <<    >>
按位与 &
按位异或 ^
按位或 ` `
关系和类型测试 >=    >    <=    <    as    is    is!
相等 ==    !=
逻辑与 &&
逻辑或 ` `
是否为null ??
天健判断(三元运算) expr1 ? expr2 : expr3
级联 ..
赋值 =    *=    /=    ~/=    %=    +=    -=    <<=    >>=    &=    ^=

当使用操作符后,就变成了表达式。

算术运算符

运算符 说明
+ 加法
- 减法
-expr 一元减号,也称为否定
* 乘法
/ 除法
~/ 取模运算
% 取余运算
  1. assert(2 + 3 == 5);
  2. assert(2 - 3 == -1);
  3. assert(2 * 3 == 6);
  4. assert(5 / 2 == 2.5); // Result is a double
  5. assert(5 ~/ 2 == 2); // Result is an int
  6. assert(5 % 2 == 1); // Remainder
  7. assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
  8. // Dart还支持前缀和后缀递增和递减运算符。
  9. var a, b;
  10. a = 0;
  11. b = ++a; // Increment a before b gets its value.
  12. assert(a == b); // 1 == 1
  13. a = 0;
  14. b = a++; // Increment a AFTER b gets its value.
  15. assert(a != b); // 1 != 0
  16. a = 0;
  17. b = --a; // Decrement a before b gets its value.
  18. assert(a == b); // -1 == -1
  19. a = 0;
  20. b = a--; // Decrement a AFTER b gets its value.
  21. assert(a != b); // -1 != 0

相等和关系运算符

运算符 说明
== 相等
!= 不等
> 大于
< 小于
>= 大于等于
<= 小于等于

类型测试操作符

a, is, and is!操作符可以方便地在运行时检查类型。

运算符 说明
as 形态转换
is 如果对象具有指定的类型,则为True
is! 如果对象具有指定的类型,则为False

赋值运算符

??=操作符仅仅在变量为null时会赋值。未初始化和后来手动赋值为null的情况都会执行此操作赋值。

  1. // Assign value to a
  2. a = value;
  3. // Assign value to b if b is null; otherwise, b stays the same
  4. // 仅仅在b为空的情况下b被赋值value否则b的值不变
  5. b ??= value;

复合赋值操作符

如+=将操作与赋值合并。

= -= /= %= >>= ^=
+= *= ~/= <<= &= ` =`

逻辑运算符

可以使用逻辑运算符组合布尔表达式或取反布尔表达式。

运算符 说明
!expr 对!后的表达式结果取反(如果表达式结果为false则表达式前加!使其变为true,反之亦然)
` ` 逻辑或
&& 逻辑与(且)

位和移位运算

运算符 说明
& 按位与
` ` 按位或
^ 按位异或
~expr 按位取反
<< 左移
>> 右移
  1. final value = 0x22;
  2. final bitmask = 0x0f;
  3. assert((value & bitmask) == 0x02); // AND
  4. assert((value & ~bitmask) == 0x20); // AND NOT
  5. assert((value | bitmask) == 0x2f); // OR
  6. assert((value ^ bitmask) == 0x2d); // XOR
  7. assert((value << 4) == 0x220); // Shift left
  8. assert((value >> 4) == 0x02); // Shift right

条件表达式

  1. // 如果条件为真,则计算expr1(并返回其值);否则,计算并返回expr2的值。
  2. condition ? expr1 : expr2
  3. // 如果expr1是非空的,则返回其值;否则,计算并返回expr2的值。
  4. expr1 ?? expr2
  5. // 基于布尔表达式的结果选择赋值
  6. var visibility = isPublic ? 'public' : 'private';
  7. // 布尔表达式只想判断值是否为null
  8. String playerName(String name) => name ?? 'Guest';

级联表示法

.. 允许您在同一个对象上创建一个操作序列。

其它运算符

运算符 名称 说明
() 功能函数 表示一个函数调用
[] 访问列表 引用列表中指定索引处的值
· 访问成员 表示表达式的属性;例如:foo.bar从表达式foo中选择属性bar,如果foo为null,会抛出异常
?. 根据条件访问成员 和(.)相似,但是左边的操作数可以为空;例如: foo?.bar 从foo的表达式中选择bar属性,如果foo为空则返回null