运算符用于执行各种操作,例如算术、位运算等,是Dart代码中的基本构建块,用于对数据进行操作并控制程序流。
1 运算符
- 位运算符:
&
(与)、|
(或)、^
(异或)、~expr
(一元位补码)、<<
(左移)、>>
(右移)。 - 算术运算符:
+
、-
、*
、/
、%
、~/
(返回一整数值的除法)、-expr
(一元减号即负号)。 - 关系运算符:
==
(等)、!=
(不等)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于)。 - 赋值运算符:
=
、??=
、+=
、-=
、*=
、/=
、%=
、~/=
、<<=
、>>=
、&=
、^=
、|=
。 - 逻辑运算符:
!expr
(反转表达式)、||
(逻辑或)、&&
(逻辑与),只两个值。 - 级联运算符:
..
(可对同一对象执行系列操作,严格说级联符号并非运算符)。 - 条件表达式:
condition ? expr1 : expr2
(三元表达式)、expr1 ?? expr2
。 - 类型判定运算符:
is
(相应类型)、is!
(非相应类型)、as
(转换为指定类型)。
2 位运算符
^
(异或):两个输入相同时为0,不同为1。- 都是通过操作位的移动来达到运算的目的。
main() {
// 位运算符
final v = 0x77; // 16进制,10进制为119,2进制为0111 0111
final b = 0xee; // 16进制,10进制为238,2进制为1110 1110
print((v & b).toRadixString(2));
print((v | b).toRadixString(2));
print((v ^ b).toRadixString(2));
print((~ v).toRadixString(2));
print((v << 1).toRadixString(2));
print((v >> 2).toRadixString(2));
print((v &~ b).toRadixString(2)); // 与非&~,转为2进制
}
3 算术运算符
+
、-
、*
、/
、%
(取余)、~/
(返回一整数值的除法)、-expr
(一元减号即负号)。- 还支持前缀递增
++var
、前缀递减--var
、后缀递增var++
、后缀递减var--
运算符。
3-1 加减乘除
main() {
// 算术运算符
var a = 3;
var b = 6;
var c = 9;
print('加:' + (a + c).toString());
print('减:' + (a - b).toString());
print('乘:' + (a * b).toString());
print('除:' + (c / b).toString());
print('取余:' + (c % b).toString());
print('取整:' + (c ~/ b).toString());
var d = b - a;
print('赋值:' + d.toString());
}
3-2 递增递减
main() {
var a = 3;
var x1, x2, y1, y2;
// 在x1获得值前自增a
x1 = ++a;
print('$a --- $x1');
// 在y1获得值后自增a
y1 = a++;
print('$a --- $y1');
// 在x2获得值前自减a
x2 = --a;
print('$a --- $x2');
// 在y2获得值后自减a
y2 = a--;
print('$a --- $y2');
}
4 关系运算符
- 测试两个对象是否表示相同的事务,使用
==
运算符。 - 确定两个对象是否完全相同,使用
identical()
函数。
main() {
// 关系运算符
int a = 5;
int b = 3;
print(a != b);
print(a > b);
print(a >= b);
print(a == b);
print(a < b);
print(a <= b);
// 用于条件判断
if(a > b) {
print('a大于b');
} else {
print('a小于b');
}
int c = 5;
// 判断对象是否完全相同
int d = 6;
print(identical(c, d));
}
5 赋值运算符
- 使用
=
运算符从右向左进行赋值操作,当变量为空时,可以使用??=
运算符进行赋值。 - 复合赋值运算符:
+=
、-=
、*=
、/=
、%=
、~/=
、<<=
、>>=
、&=
、^=
、|=
。
main() {
// 赋值运算符,从右向左
var v = 1;
print(v);
// 如果z为空,则将值分配给z,否则z保持不变
var z;
z ??= v;
print(z);
// 复合赋值运算符
var a = 12;
a += 10;
print(a);
var b = 4;
b *= 3;
print(b);
}
6 逻辑运算符
- 逻辑运算符也可以反转布尔表达式,或组合布尔表达式。
main() {
// 逻辑运算符
bool flag1 = true;
print(!flag1);
// 逻辑或||
bool flag2 = false;
bool flag3 = false;
print(flag2 || flag3);
// 逻辑与&&
print(flag1 && flag2);
// 组合表达式
int age = 21;
String sex = '男';
if(age == 23 && sex == '男') {
print('$age --- $sex');
} else {
print('不打印');
}
}
7 级联运算符
- 使用
..
表示,可对同一对象执行一系列操作,严格说级联的双点符号并非运算符。 - 只是Dart语法的一部分,类似于JavaScript中Promise的then处理,目的是简化代码。
class Person {
String name;
num age;
Person(this.name, this.age);
void printInfo() {
print('${this.name} --- ${this.age}');
}
}
main() {
Person p = new Person('张三', 21);
p.printInfo();
p.name = '李四';
p.age = 22;
p.printInfo();
p
..name = '王五'
..age = 23
..printInfo();
}
8 条件表达式
condition ? expr1 : expr2
:条件为真返回expr1,否则返回expr2(三元表达式)。expr1 ?? expr2
:如果expr1为非空,返回expr1的值,否则计算并且返回expr2的值。
main() {
// if...else
bool flag1 = true;
if(flag1) {
print('正确');
} else {
print('错误');
}
// condition ? expr1 : expr2
var flag2 = true;
String result = flag2 ? '正确' : '错误';
print(result);
// expr1 ?? expr2
var x;
var y = x ?? 1000;
print(y);
}
9 类型判定运算符
is
:当对象是相应类型时,返回true。is!
:对象不是相应类型时,返回true。as
:将一个对象转换为指定类型,前提是能够转换,转换之前可先用is进行判断。
main() {
// 类型判定运算符
var a = 123;
if(a is int) {
print('a是int类型');
} else {
print('a是其他类型');
}
}