前言:本系列内容假设读者有一定的编程基础,如了解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.

[dart学习]第五篇:操作符的更多相关文章

  1. [dart学习]第四篇:函数和操作符(本篇未完待续)

    接着学习dart的函数和操作符. 1.函数Function dart是一种真正的面向对象的语言,通常一个函数也是Function类型的对象,这也就是说可以把函数赋值给一个变量,或者作为另一个函数的入参 ...

  2. [dart学习]第三篇:dart变量介绍 (二)

    本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...

  3. [dart学习]第七篇:类(构造函数)

    前言:楼主平时基本没有使用过异常处理,所以对异常的认知可能不够准确,这里就不翻译异常的相关内容了,大家可以去官网自行阅读介绍,地址 https://dart.dev/guides/language/l ...

  4. [dart学习]第六篇:流程控制语句

    经过前面的基础知识了解学习,我们今天可以进入语句模块啦. dart主要有以下流程控制语句: if-else for循环 while和do-while循环 break和continue switch-c ...

  5. Shell编程学习---第五篇:Shell的输入和输出

    在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或 者指定一个文件作为输入.对于输出也是一样:如果不指定某个文件作为输出,标准输出总 是和终端屏幕相关联.如果所使用命令 ...

  6. 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2

    从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...

  7. R语言学习 第五篇:字符串操作

    文本数据存储在字符向量中,字符向量的每个元素都是字符串,而非单独的字符.在R中,可以使用双引号,或单引号表示字符. 一,字符串中的字符数量 函数nchar()用于获得字符串中的字符数量: > s ...

  8. Python 学习 第五篇:语句和语法

    Python程序是语句构成的,语句包含表达式,表达式嵌套在语句中,包含变量和常量,用于处理对象.Python的语法实质上是由表达式.语句和代码块构成的.语句是由表达式构成的,代码块是由多个语句构成的复 ...

  9. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

随机推荐

  1. VMware Workstation 14 安装使用 (小白安装使用教程)

    在一台 PC 上运行多个操作系统,借助 VMware Workstation Pro,您可以在同一台 Windows 或 Linux PC 上同时运行多个操作系统.创建真实的 Linux 和 Wind ...

  2. 中国大学MOOC课程信息之数据分析可视化二

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82318571 - 写在前面 本篇博客继续对中国大学MOOC ...

  3. 队列(queue)和堆栈(stack)的学习

    队列 1 . 先进先出  .队列尾进行插入,队列头进行删除,获取,修改.      -----first come  ,first served .   --first in  .first  out ...

  4. linux服务器管理

    1.找出目前系统开启的网络服务有哪些? netstat -tulp 2.找出所有的有监听网络的服务(包含socket状态) Netstat -lnp 3.查看所有的服务状态 Service –-sta ...

  5. 全排列 递归方法(permutation原理

    https://blog.csdn.net/axiqia/article/details/50967863  原博客 (一)递归的全排列算法 (A.B.C.D)的全排列为 1.A后面跟(B.C.D)的 ...

  6. TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。

    一.TCP通信测试: 1)   创建TCP Server: 选中左方的TCP Server, 然后点击”创建”按钮,软件弹出监听端口输入框 输入监听端口后,即创建了一个在指定端口上进行监听的TCP S ...

  7. 如何让DEV跳出的“提示试用版”的对话框不再显示

    在 使用DevExpress控件的时候.每次对窗体进行更改的时候,都会出现一个对话框.发布的时候 也会出现一个对话框.之前的解决方法是在发布的时候把licenses.licx给删除掉,但是这个方法治标 ...

  8. JavaScript中数组的排序——sort()

    数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. arrayObject.sort(方法函数) 1.如果不指定<方法函数>,则按unicode码顺序排列. 2.如果 ...

  9. delphi TAdoQuery组件的close方法可能导致”列名无效“错误

    1,故障现象 一次程序运行,出现如下错误: 对应代码如下: 2,故障分析 Query_alert_2的语句在查询分析器中单独执行是正常的.排除语句出错. 如果注解掉Query_alert_1,则错误变 ...

  10. mybatis+mysql批量插入和批量更新

    一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.x ...