#头条创作挑战赛#
上一篇,我们讲了 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.5print(a ~/ 2); // 5print(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); // truevar 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 = 01 * 2^1 = 21 * 2^2 = 41 * 2^3 = 8...1 * 2^31 = 2147483648然后将这些值加起来 0 + 2 + 4 + 8 + ... + 2147483648 = 4294967294或者你可以这么计算:2^32 - 2 = 4294967294复制代码
Dart 中有两个特殊的运算符来代替 if-else 语句:
// 根据布尔值进行判断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. }}复制代码
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏