携手创作,一起生长!这是我参与「日新计划 8 月更文应战」的第2天,点击检查活动概况
上一篇,咱们讲了 Dart 知识点 – 数据类型,本文咱们来讲讲 Dart 知识点 – 运算符。 运算符是一个很基础可是很重要的知识点~
算术运算符
| 运算符 | 描绘 | 示例 |
|---|---|---|
| + | 加 |
int a += 1; // 等价于 int a = a + 1; 下面雷同 |
| – | 减 | int a -=1; |
| -表达式 | 一元减号码(或许说负号),使表达式后面的值翻过来 | int a = 1; a = -a; |
| * | 乘 | int a *= 2; |
| / | 除 | int a /= 2 |
| ~/ | 除并取整 | int a ~/= 2 |
| % | 取模 | int a %= 2 |
| var++ | 自增 |
int a = 1; int b = a++; // b 值为 1 |
| ++var | 自增 |
int a = 1; int b = ++a; // b 值为 2 |
| var– | 自减 |
int a = 1; int b = a--; // b 值为 1 |
| –var | 自减 |
int a = 1; int b = --a; // b 值为 0 |
int a = 11;
print(a / 2); // 5.5
print(a ~/ 2); // 5
print(a % 2); // 1
考虑下 自增自减的成果为什么会不同呢?
答案(点击打开)
拿 int a = 1; int b = a++; 为例。
1. 首要 a 将值赋予变量 b 之后
2. 之后进行自增。
这时候你打印 a 的值,得到的值是 2。
b = a++ 就相当于 b = a; a = a + 1;
关系运算符
假定变量 a 和 变量 b 都为 int 类型。
| 运算符 | 描绘 | 示例 |
|---|---|---|
| == | 持平 |
a == b,回来布尔值 |
| != | 不等于 |
a != b,回来布尔值 |
| > | 大于 |
a > b,回来布尔值 |
| < | 小于 |
a < b,回来布尔值 |
| >= | 大于等于 |
a >= b,回来布尔值 |
| <= | 小于等于 |
a <= b,回来布尔值 |
嗯,这没什么好进行代码展现的,很中规中矩的内容
类型判别运算符
| 运算符 | 描绘 | 示例 |
|---|---|---|
| as | 类型转换 |
employee as Person,Person 是一个类 |
| is | 假如目标是指定类型则回来 true | employee is Person |
| is! | 假如目标是指定类型则回来 false | employee is! Person |
void main() {
var jimmy = Person();
var animal = Animal();
print(jimmy.name); // Jimmy
print(jimmy is Person); // true
print(jimmy is! Animal); // true
print(jimmy as Person); // Instance of 'Person'
print(jimmy as Animal); // 报错:Uncaught Error: TypeError: Instance of 'Person': type 'Person' is not a subtype of type 'Animal'
}
class Person {
String name = 'Jimmy';
}
class Animal {
final String name = 'Lion';
}
obj is Object总为 true,因为所有类都是 Object 的子类
运用 as 运算符将目标强制转换为特定的类型,一般能够认为是 is 或 is! 类型判定后,被判定目标调用函数的一种缩写形式。比如上面的代码 jimmy as Person 改写如下:
if(jimmy is Person) {
jimmy.name = 'Jimmy Pang';
}
// 运用 as 运算符进行缩写
(jimmy as Person).name = 'Jimmy Pang';
上面的代码并非等价。假如
jimmy为null或许不是Person目标,jimmy.name = 'Jimmy Pang';将不会履行,而(jimmy as Person).name = 'Jimmy Pang';就会跑出异常(见上print(jimmy as Animal);部分)
赋值运算符
上面咱们已经触摸过了 =,+= 等。也就是赋值运算符的两种办法:
- 运用
=来赋值 - 运用
??=来赋值(??表明其他运算符),称为复合运算符
简单举例:
| 运算符 | 描绘 | 示例 |
|---|---|---|
| /= | 除后赋值 |
a /= 2;,等价于 a = a / 2;
|
逻辑运算符
运用逻辑运算符咱们能够回转或许组合布尔表达式。
| 运算符 | 描绘 | 示例 |
|---|---|---|
| ! | 对表达式成果取反,成果是布尔值 | bool flag = false; if(!flag){} else {} |
| 逻辑或 | a b | |
| && | 逻辑与 | a && b && c |
bool a = false;
bool b = true;
var c = a || b;
print(c); // true
var d = !a && b;
print(d); // true
位运算符
假定咱们有两个 int 类型的变量:
int a = 1;
int b = 2;
| 运算符 | 描绘 | 示例 |
|---|---|---|
| & | 按位与 |
a & b,成果是 0 |
| 按位或 | a b,成果是 3 | |
| 按位异或 |
a ^ b,成果是 3 |
|
| ~ | 按位取反(0 变 1, 1 变 0) |
~a,成果是 4294967294 |
| << | 位左移 |
a << 1,成果是 2 |
| >> | 位右移 |
b >> 1,成果是 1 |
嗯,也许你还不是很了解,咱们拿 ~a 举个比如吧,它的成果是 4294967294?咱们先来考虑下
答案(点击打开)
int a = 1; 其实用 0 和 1 表明,能够表明为 0000 0000 0000 0000 0000 0000 0000 0001 共 32 位。
~a 之后,能够表明为 1111 1111 1111 1111 1111 1111 1111 1110。
从左往右,能够取得值如下:
0 * 2^0 = 0
1 * 2^1 = 2
1 * 2^2 = 4
1 * 2^3 = 8
.
.
.
1 * 2^31 = 2147483648
然后将这些值加起来 0 + 2 + 4 + 8 + ... + 2147483648 = 4294967294
或许你能够这么核算:
2^32 - 2 = 4294967294
条件表达式
Dart 中有两个特别的运算符来替代 if-else 句子:
-
条件 ? 表达式1 : 表达式2(三目运算符) 表达式1 ?? 表达式2
// 根据布尔值进行判别
var visibility;
bool isPublic = true;
if(isPublic) {
visibility = 'public';
} else {
visibility = 'private';
}
// 等价为
var visibility = isPublic ? 'public' : 'private';
// 假如赋值判定是否为 `null` 则考虑运用 `??`
String playerName(String? name) {
if(name != null) {
return name;
} else {
return 'Guest';
}
}
// 其实咱们能够这么写
String playerName(String? name) => name ?? 'Guest';
级联运算符
级联运算符现在有两个:
..-
?..假如目标为空状况,可是?..要第一个开始调用(这个有点为难,读者自行验证)
If the object that the cascade operates on can be null, then use anull-shortingcascade (
?..) for the first operation. Starting with?..guarantees that none of the cascade operations are attempted on that null object.
能够让咱们在同一个目标上接连调用该目标的多个变量或许办法。
void main() {
var person = Person()
?..country = 'China'
..sayHi();
}
class Person {
final String name = 'Jimmy';
String country = '';
sayHi() {
print('Hello ' + this.name + '.'); // Hello Jimmy.
}
}
往期精彩引荐
- Dart 知识点 – 数据类型
假如读者觉得文章还能够,不防一键三连:关注➕点赞➕保藏
