简介:
Dart中支持的操作符:
描述 | 操作符 |
---|---|
一元后缀 | expr++(递增) expr--(递减) () [] ?[] . ?. |
一元前缀 | -expr(负数) !expr(取反) ~expr(一元位补码) ++expr(递增) --expr(递减) await expr(异步) |
算术运算符 | + - * / %(取余) ~/(取整) |
位运算符 | <<(左移) >>(右移) >>>(无符号右移) &(位与) ^(位异或) | (位或)~expr(一元位补码) |
关系运算符 | >=(大于等于) >(大于) <=(小于等于) <(小于) ==(相等或者等价) !=(不等) |
类型测试 | as(类及其子类) is(类) is!(不是类) |
逻辑 | &&(且) ||(或) !(非) |
判空 | ?? |
三目 | expr1 ? expr2 : expr3 |
级联 | .. ?.. |
赋值 | = *=(乘等) /=(除等) +=(加等) -=(减等) &= ^= ??= <<= |= etc. |
算术运算符:
算术运算符的/
,两个整数相除,不能整除时,获得的结果是double
的结构,和swift不相同。
int number = 12;
int number2 = 5;
print(number % number2); // 取余 2
print(number ~/ number2); // 取整 2
var num = number / number2;
print(num); // 2.4
print(num.runtimeType); // double
一元运算符:
讲一下++
和--
在变量前后的问题:如果运算符变量参与运算或赋值;运算符在前变量在后,这种情况下先进行变量的自增或者自减,然后参与参数运算或赋值;运算符在后变量在前,这种情况下先进行参与变量的运算或赋值,然后进行变量的自增或者自减。如下:
int number = 12;
int number3 = number--; // --在后,先进行复制操作,将number值赋值给number3,number再进行自-1操作,所以打印number3的值为12,此时number的值为11
int number4 = --number; // --在前,先进行number再进行自-1操作,此时number为10,再将number的值赋值给number4,number4的值为10
print(number3); // 12
print(number4); // 10
关系运算符:
关系运算符是对两个对象进行关系判断。
int number6 = 13;
int number5 = 5;
print(number6 == number5); // 判断是否相等
print(number6 != number5); // 判断是否不等
print(number6 > number5); // 判断是否大于
print(number6 >= number5); // 判断是否大于等于
类型测试运算符:
as
用于强制类型转换,强制转换的类型必须是对象的类或者父类,否则运行时会报错。
is
判断对象是否属于某个类及其子类,is!
判断对象是否不是某个类及其子类。
class Person {
final String name;
final int age;
const Person(this.name, this.age);
}
class Man extends Person {
static const String type = 'Man';
final String beard;
Man(String name, int age, this.beard) : super(name, age);
}
// as is
var man = Man("张三丰", 230, "白胡子");
var persion = Person('张无忌', 23);
// print((persion as Man).name); // 运行时,报错
print((man as Person).name);
if (man is Person) {
print("man is Person");
}
赋值运算符:
??=
表示如果变量为null
时,将后边的值赋给变量,如果变量不为null
,不进行赋值操作。
关于a op= b
的赋值操作符,等价于a = a op b
。
int? number7;
int? number8 = 11;
number7 ??= 10;
number8 ??= 10;
print(number7); // 10
print(number8); // 11
number8 += number7; // 等价于number8 = number8 + number7
print(number8); // 21
位运算符:
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
>>> | 无符号右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
const value = 0x22; // 二进制:0000 0010 0010
const bitmask = 0x0f; // 二进制:0000 0000 1111 取反:1111 1111 0000
assert((value & bitmask) == 0x02); // 与(相同的二进制位运算):0 & 0 = 0,0 & 1 = 0,1 & 1 = 1
assert((value | bitmask) == 0x2f); // 或(相同的二进制位运算):0 & 0 = 0,0 & 1 = 1,1 & 1 = 1
assert((value ^ bitmask) == 0x2d); // 异或(相同的二进制位运算):0 & 0 = 0,0 & 1 = 1,1 & 1 = 0
assert((value & ~bitmask) == 0x20);
assert((value << 4) == 0x220); // 左移
assert((value >> 4) == 0x02); // 右移
const fValue = -value; // 二进制:0000 0011 1101
print((fValue >> 4) == -0x03); // 右移
// assert((value >>> 4) == 0x02); // 无符号右移
// assert((-value >>> 4) > 0); // 无符号右移
条件表达式:
condition ? expr1 : expr2
表示条件 ? 值1 : 值2
,当条件位true
时是值1,否则为值2。
expr1 ?? expr2
表示 值1 ?? 值2
,当值1为null
时,取值2。
bool isSuccess = true;
var successStr = isSuccess ? "成功" : "失败";
int? nullInt;
var someInt = nullInt ?? 2;
print(successStr); // 成功
print(someInt); // 2
级联操作符:
var person = Person()
..name = "lucy"
..age = 16;
Person? person3;
person3?..name = "Lin"
..age = 24;
var person2 = Person();
person2.name = "Luck";
person2.age = 18;
其它操作符:
符号 | 名称 | 意义 |
---|---|---|
() | 函数的应用 | 表示函数调用 |
[] | 下标访问 | 表示对可重写操作符[]的调用;例如:monist[1]将int 1传递给monist以访问索引1的元素 |
?[] | 可选下标访问 | 与[]相同,但是允许访问的数组变量为null |
. | 成员或者属性访问 | 访问类的属性或者方法等 |
?. | 可选成员或者属性访问 | 和.相同,允许访问的变量为null |
Type? | 变量可选 | 表示该变量的值可以为null |
: | 函数重定向 | 用于函数重定向,及在调用该函数前需要做的事(例如调用其它函数或者提供初始化变量值等);早期Dart版本用于提供参数默认值 |
网友评论