前言:本系列内容假设读者有一定的编程基础,如了解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. Linux系统运维之修炼秘法

    在这个现如今的互联网高速发展的时代,如何才能保持住一门铁的饭碗.无疑最稳妥的自然就是选择一门任何时代都不会落伍的技能,来选择深入学习研究.大家可能觉得这一期的Linux就该这么学的话题比较世俗.但是不 ...

  2. Selenium(六)对话框处理与登录测试

    1.以百度为例,找到登录框,查看元素,可以看到这是一个div 操作登录框: 通过判断是否找到这个错误提示元素查看是否登录成功. 一个简单的登录脚本:

  3. Spring-使用注解开发

    8.使用注解开发 在Spring4之后,要使用注解开发,必须要保证AOP包已经导入了 使用注解需要导入context约束,增加注解的支持! <?xml version="1.0&quo ...

  4. Task.Run 和 Task.Factory.StartNew 区别

    Task.Run 是在 dotnet framework 4.5 之后才可以使用, Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制. 可以认为 ...

  5. 第82题:删除排序链表中的重复元素II

    一. 问题描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 ...

  6. WebLogic 12c 版 下载与安装(ubuntu)

    下载地址:https://www.oracle.com/middleware/technologies/fusionmiddleware-downloads.html 参考地址:https://blo ...

  7. Educational Codeforces Round 74 (Rated for Div. 2) B. Kill 'Em All

    链接: https://codeforces.com/contest/1238/problem/B 题意: Ivan plays an old action game called Heretic. ...

  8. Codeforces Round #584 A. Paint the Numbers

    链接: https://codeforces.com/contest/1209/problem/A 题意: You are given a sequence of integers a1,a2,-,a ...

  9. 使用Eclipse进行远程调试(转)

    做开发好多年了,Debug大家肯定都不陌生,绝对称得上是家常便饭了.博主虽不敢妄下断言,但是这里也猜一下,肯定有很多人都没有使用过Remote Debug(远程调试).说来惭愧,博主也是工作了3年才用 ...

  10. Win10远程桌面 报错:CredSSP加密Oracle修正……

    解决方法: 运行 gpedit.msc 本地组策略: 计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击. 参考: https://blog.c ...