前言:本系列内容假设读者有一定的编程基础,如了解C语言、python等。
本节一起来学习dart的操作符,直接拷贝官网的操作符描述表如下:
Description | Operator |
---|---|
unary postfix | expr++ expr-- () [] . ?. |
unary prefix | -expr !expr ~expr ++expr --expr |
multiplicative | * / % ~/ |
additive | + - |
shift | << >> >>> |
bitwise AND | & |
bitwise XOR | ^ |
bitwise OR | | |
relational and type test | >= > <= < as is is! |
equality | == != |
logical AND | && |
logical OR | || |
if null | ?? |
conditional | expr1 ? expr2 : expr3 |
cascade | .. |
assignment | = *= /= += -= &= ^= etc. |
上表中列出的操作符的先后顺序,是和各操作符的优先级对应的。例如:乘法运算符 * 的优先级高于加法运算符 +。
同其他编程语言一样,建议大家在写表达式时不要吝啬使用括号,这样可以使代码更易读。如 a*b+3==c*f,建议写成 ((a*b)+3) == (c*f) 的形式。
这里指出一点:对于双元操作符,如加法运算符+,如果操作符左右两边的参数类型不一致,则以左边的参数类型为准。如: 3.14+6=9.14,使用浮点型的加法运算。
下面详细来看各种类型的运算符。
(一)算术运算符
+ |
Add(加法运算符) |
– |
Subtract(减法运算符) |
-expr |
Unary minus, also known as negation (reverse the sign of the expression) (负数表达) |
* |
Multiply (乘法运算符) |
/ |
Divide (除法运算符) |
~/ |
Divide, returning an integer result (返回整型的除法运算符) |
% |
Get the remainder of an integer division (modulo) (取模、取余运算符) |
算术运算符比较简单,下面通过几个例子伪代码来说明:
3 + 2 == 5; 6 - 2 == 4; 2 - 9 == -7; 3 * 5 == 15; 5 % 2 == 1; // 注意以下两个运算符 5 / 2 == 2.5; //结果是浮点型 5 ~/ 2 == 2; //结果是整型
另外,dart还支持++和--(自增、自减)运算,依然看例子:
var a,b; a=0; b=++a; // a先自增1,再赋值给b assert(a==b); // 1 == 1 a=0; b=a++; // a先赋值给b,然后a再自增1 assert(a!=b); // 1 != 0; // --运算同理
(二)关系操作符
Operator | Meaning |
---|---|
== |
Equal; (判断相等) |
!= |
Not equal (判断不相等) |
> |
Greater than (大于) |
< |
Less than (小于) |
>= |
Greater than or equal to (大于或等于) |
<= |
Less than or equal to (小于或等于) |
这个也比较简单,只需注意以下几点:
null == null 是正确的,返回true,若其中一个操作数是null,另一个是非null,则返回false;
如果需要判断两个操作数是否是相同的类型,可使用 identical() 接口。
(三)类型检查运算符
Operator | Meaning |
---|---|
as |
Typecast (also used to specify library prefixes) (用于类型强转) |
is |
True if the object has the specified type (用于判断变量是否属于某种类型) |
is! |
False if the object has the specified type (用于判断变量是否不属于某类型) |
依然看官网的例子:
// 例句1
if (emp is Person) { // Type check emp.firstName = 'Bob'; }
// 例句2
(emp as Person).firstName = 'Bob';
上例中,例句1检查emp变量是否是Person类型的实例,如果是,则赋值名称元素Bob,如果不是,则什么也不操作;
例句2将emp强转为Person类型,并尝试对firstname赋值。如果emp不是Person类型,则本句话会抛出异常。
(四)赋值运算符
这个就非常常见了,我们在其他语言中也是使用最多的就是 = 赋值运算符。dart有一个特例,支持 ??= 赋值运算符。我们看例子:
// 将value赋值给变量a
a = value;
// 如果b是null,则将value赋值给b; 否则b保持原值
b ??= value;
dart同样也支持复合赋值运算符,例如: +=、-=、*=、/=、~/=、%=、<<=、>>=、&=、|=、^= 。 具体用法例如 a += 2 表示 a = a + 2; 不再细述。
(五)逻辑运算符
可以使用逻辑运算符反转或组合bool表达式。这个就不再举例使用了,直接看下表:
Operator | Meaning |
---|---|
!expr |
inverts the following expression (changes false to true, and vice versa) (逻辑非) |
|| |
logical OR (逻辑或) |
&& |
logical AND (逻辑与) |
(六)位运算符
这个对于像博主这样搞嵌入式的人来说再熟悉不过了吧 ^_^
Operator | Meaning |
---|---|
& |
AND (位与) |
| |
OR (位或) |
^ |
XOR (位异或) |
~expr |
Unary bitwise complement (0s become 1s; 1s become 0s) (位取反) |
<< |
Shift left (左移) |
>> |
Shift right (右移) |
位运算一般应用于整型数字,这个也属于比较基本的,就也不再举例了
(七)条件运算符
熟悉C语言的朋友应该知道C语言里边的一个三目运算符 ?: ,这种运算符能够简化代码(当然,可读性会下降)。dart支持两个条件运算符:
condition ? expr1 : expr2 //如果condition是true,则执行expr1并返回; 否则执行expr2并返回 expr1 ?? expr2 //如果expr1是非空,则执行expr1并返回; 否则执行expr2并返回
我们看一下第二种运算符的一个例子吧
// Slightly longer version uses ?: operator. String playerName(String name) => name != null ? name : 'Guest'; // Very long version uses if-else statement. String playerName(String name) { if (name != null) { return name; } else { return 'Guest'; } } // 以上两段代码的作用是等价的
(八)其他运算符
dart还支持一些比较不常用或不宜用的运算符(个人观点),比如 级联运算符,本人觉得使用这样的运算符会导致代码及其不易读且容易出错。这里就不再一一列举了,大家可以去官网了解。(附地址: https://dart.dev/guides/language/language-tour#cascade-notation-)
Game over.