Dart 知识点 - 运算符
转载
上一篇,我们讲了 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
类型的变量:
运算符
| 描述
| 示例
|
&
| 按位与
| 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 a null-shorting cascade (?..
) 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.
}
}
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏