[dart学习]第五篇:操作符
前言:本系列内容假设读者有一定的编程基础,如了解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学习]第五篇:操作符的更多相关文章
- [dart学习]第四篇:函数和操作符(本篇未完待续)
接着学习dart的函数和操作符. 1.函数Function dart是一种真正的面向对象的语言,通常一个函数也是Function类型的对象,这也就是说可以把函数赋值给一个变量,或者作为另一个函数的入参 ...
- [dart学习]第三篇:dart变量介绍 (二)
本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...
- [dart学习]第七篇:类(构造函数)
前言:楼主平时基本没有使用过异常处理,所以对异常的认知可能不够准确,这里就不翻译异常的相关内容了,大家可以去官网自行阅读介绍,地址 https://dart.dev/guides/language/l ...
- [dart学习]第六篇:流程控制语句
经过前面的基础知识了解学习,我们今天可以进入语句模块啦. dart主要有以下流程控制语句: if-else for循环 while和do-while循环 break和continue switch-c ...
- Shell编程学习---第五篇:Shell的输入和输出
在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或 者指定一个文件作为输入.对于输出也是一样:如果不指定某个文件作为输出,标准输出总 是和终端屏幕相关联.如果所使用命令 ...
- 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2
从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...
- R语言学习 第五篇:字符串操作
文本数据存储在字符向量中,字符向量的每个元素都是字符串,而非单独的字符.在R中,可以使用双引号,或单引号表示字符. 一,字符串中的字符数量 函数nchar()用于获得字符串中的字符数量: > s ...
- Python 学习 第五篇:语句和语法
Python程序是语句构成的,语句包含表达式,表达式嵌套在语句中,包含变量和常量,用于处理对象.Python的语法实质上是由表达式.语句和代码块构成的.语句是由表达式构成的,代码块是由多个语句构成的复 ...
- Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
随机推荐
- 用python实现新词发现程序——基于凝固度和自由度
互联网时代,信息产生的数量和传递的速度非常快,语言文字也不断变化更新,新词层出不穷.一个好的新词发现程序对做NLP(自然预言处理)来说是非常重要的. N-Gram加词频 最原始的新词算法莫过于n-gr ...
- Windows与Linux之间文件传输
(1).使用WinSCP工具,实现将Windows的文件上传到Linux指定目录下 (1).输入主机名.用户名.密码,选择登录,成功连接至Linux系统 (2).在左侧列表,选择要上传文件,单击右键选 ...
- ZZNUOJ-2155-单身man集合-【标程做法:数位DP-1-10^8,提前暴力打表法: 砍时间复杂度到10^5】
ZZNUOJ-2155: 单身MAN集合 题目描述: 单身man们突然集结起来了,虽然我们不知道它们想要干什么.你作为单身man的首领需要管理好每一只单身man,机智的你给每一只单身man编了一个编号 ...
- 将自己写的组件封装成类似element-ui一样的库,可以cdn引入
在写好自己的组件之后 第一步 修改目录结构 在根目录下创建package文件夹,用于存放你要封装的组件 第二部 在webpack配置中加入 pages与publicpath同级 pages: { in ...
- POJ-3186-Treats for the Cows(记忆化搜索)
链接: https://vjudge.net/problem/POJ-3186 题意: FJ has purchased N (1 <= N <= 2000) yummy treats f ...
- HDU 6134 Battlestation Operational | 2017 Multi-University Training Contest 8
破结论没听说过,上式推导到第三步的时候有了O(nlogn) 的做法(枚举倍数+1最后前缀和),并且这种做法可以直接应用到向上取整的计算中,详见forever97 但由于d(n)是积性函数,故可O(n) ...
- linux 批量创建用户
user 模块添加用户 python -c 'from passlib.hash import sha512_crypt; import getpass; print (sha512_crypt.en ...
- python--第四天练习题
#1.写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者. def rec(a,b,dep=1): c = a + b if dep == 10: return c return ...
- border-width
border-width 语法: border-width:<line-width>{1,4} <line-width> = <length> | thin | m ...
- SpingMVC入门
Springmvc简介及配置 1. 什么是springMVC? Spring Web MVC是一种基于Java的实现了MVC设计模式的.请求驱动类型的.轻量级Web框架. 2. SpringMVC处理 ...