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):
- 先执行
n % i、d % i(%优先级最高) - 再执行两个
==相等比较 - 最后执行中间的
&&逻辑与

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: Dart 变量