前言:本系列内容假设读者有一定的编程基础,如了解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. 关于zsh在使用scp时报错zsh: no matches found: scp

    root@banxia:scp root@172.16.13.150:/123/* . zsh: no matches found: root@172.16.13.150:/123/* root@ba ...

  2. I2C总线、设备、驱动

    I2C总线.设备.驱动 框架 I2C驱动框架可分为3个部分,分别是:I2C核心层.I2C总线驱动层(适配器层)以及I2C设备驱动层: I2C核心层 提供了统一的I2C操作函数,主要有两套函数smbus ...

  3. 机器学习(十)—聚类算法(KNN、Kmeans、密度聚类、层次聚类)

    聚类算法 任务:将数据集中的样本划分成若干个通常不相交的子集,对特征空间的一种划分. 性能度量:类内相似度高,类间相似度低.两大类:1.有参考标签,外部指标:2.无参照,内部指标. 距离计算:非负性, ...

  4. Paper Reading:推荐系统评价指标综述

    论文:推荐系统评价指标综述 发表时间:2012 发表作者:朱郁筱,吕琳媛 论文链接:论文链接 本文对现有的推荐系统评价指标进行了系统的回顾,总结了推荐系统评价指标的最新研究进展,从准确度. 多样性.新 ...

  5. Wannafly挑战赛24-A-石子游戏--【思维题】

    链接:https://www.nowcoder.com/acm/contest/186/A 来源:牛客网 石子游戏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  6. file控件选择同一文件不触发change事件和img控件不改变src的情况下图片不刷新问题解决

    最近跑来前端掺和了.. file控件的问题用 inputFile.value = ''; img控件的问题,在图片后面添加一串无意义的参数即可,例如: img.src = 'file:///' + 本 ...

  7. recyclerview + cardview

    https://www.jianshu.com/p/3a1ea6f78ad5http://qwzs112.iteye.com/blog/2235410https://github.com/mukesh ...

  8. pyinstaller打包程序包含openpyxl库问题解决

    带有openpyxl库时,直接打包,总会失败: 原因:看本地文件...Anaconda3\Lib\site-packages\PyInstaller\hooks\hook-openpyxl.py 发现 ...

  9. 【题解】间隔排列-C++

    题目Description小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为 ...

  10. 011_Linux驱动之_s3c2410_gpio_getpin

    1. 功能:获取引脚状态 2. 函数原型: unsigned int s3c2410_gpio_getpin(unsigned int pin) { void __iomem *base = S3C2 ...