运算符 (Operators)

Dart 支持下表所列全部运算符,表格按优先级从高到低排序

分类说明运算符结合性
一元后置运算符expr++ expr-- () [] ?[] . ?. !
一元前置运算符- expr ! expr ~ expr ++ expr -- expr await expr
乘除运算* / % ~/左结合
加减运算+ -左结合
移位运算<< >> >>>左结合
按位与&左结合
按位异或^左结合
按位或|左结合
关系与类型检测>= > <= < as is is!
相等判断== !=
逻辑与&&左结合
逻辑或||左结合
空值合并运算符??左结合
三元条件运算符expr1 ? expr2 : expr3右结合
级联运算符.. ?..左结合
赋值运算符= *= /= += -= &= ^=右结合
展开运算符(见备注)... ...?

使用上面的运算符,再结合操作数,即可构成运算表达式

例如:

a++
a + b
a = b
a == b
c ? a : b
a is T

下面是正式例子

void main() {
  // 1. 后置自增表达式 a++
  int a = 10;
  print("1. 后置自增 a++");
  print("自增前 a = $a");
  int temp = a++; // 先取值,后自增
  print("temp(取值结果)= $temp");
  print("自增后 a = $a\n");

  // 2. 加法运算表达式 a + b
  int b = 20;
  int sum = a + b;
  print("2. 加法 a + b");
  print("$a + $b = $sum\n");

  // 3. 赋值表达式 a = b
  a = b;
  print("3. 赋值 a = b");
  print("赋值后 a = $a\n");

  // 4. 相等判断表达式 a == b
  bool isEqual = a == b;
  print("4. 相等判断 a == b");
  print("a == b 的结果:$isEqual\n");

  // 5. 三元条件表达式 c ? a : b
  int c = 5;
  String result = c > 0 ? "c是正数" : "c是负数/0";
  print("5. 三元表达式 c ? a : b");
  print("判断 c>0:$result\n");

  // 6. 类型检测表达式 a is T
  dynamic testVal = 100;
  print("6. 类型检测 a is T");
  print("testVal is int:${testVal is int}");
  print("testVal is String:${testVal is String}");
}
Code language: Dart (dart)

大家可以复制上面代码,然后自己运行一下:dart run

运算符优先级核心规则

1. 优先级排序逻辑

运算符表格从上至下优先级逐级降低:表格上方行的运算符,优先级高于下方所有行,会优先执行。

例如:如下的> 是优先于的意思 不是大小比较。

执行先后顺序:取模 % > 相等判断 == > 逻辑与 &&

运算执行流程拆解(n % i == 0 && d % i == 0):

  1. 先执行 n % id % i% 优先级最高)
  2. 再执行两个 == 相等比较
  3. 最后执行中间的 && 逻辑与
2 括号的作用

加括号 ((n % i == 0) && (d % i == 0))仅提升代码可读性,不会改变原有运算顺序;

不加括号版本 n % i == 0 && d % i == 0:依靠原生优先级自动执行,两段代码逻辑、运行结果完全等价;

补充:只有当需要打破默认优先级时,括号才会改变执行顺序。

void main() {
  int n = 10;
  int d = 20;
  int i = 2;

  // 写法1:带括号,可读性高
  if ((n % i == 0) && (d % i == 0)) {
    print("写法1:能整除");
  }

  // 写法2:无括号,依靠优先级自动运算,效果完全一致
  if (n % i == 0 && d % i == 0) {
    print("写法2:能整除");
  }
}Code language: PHP (php)

执行结果

写法1:能整除
写法2:能整除

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注