[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).二进制的最高位是符号位, ...
随机推荐
- java_字符串
一.字符串变量 由一个专门的字符串类来进行存储处理字符串的,String类 二.字符串的连接 连接符:+ 转义字符 每个转义字符都是由两个符号组成,但是编译器把它当成一个字符. 三.字符串处理 1.求 ...
- 页面Header自适应屏幕
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- Vue 一些用法
v-model : 数据绑定(多数用于表单元素) ps:同时v-model支持双向数据绑定v-for : 用于元素遍历v-on:事件名称=“方法名” (事件绑定)ps: methods:用于绑定 v- ...
- Python 文件操作(2)
上一篇学习了用内置函数 open() 来打开文件,并且用 f.close() 来关闭文件. 今天来学习对这个文件对象的其他操作:读.写.找到文件当前位置-- 1.读取文件 三种方法: read([si ...
- 1115 JAVAScript基础
目录 JavaScript 1.基础 1.1 注释 1.2 引入方式 2. 变量 2.1 变量声明 2.2 变量的命名规范 3.常量 4. 数据类型 4.1 数值型 Number 4.2 字符串型 S ...
- (四)AppScan用外部设备(ios,安卓)录制app脚本进行安全测试
一.打开AppScan,选择外部设备/客户机,点击下 二.记录代理设置,可以手动输入需要的端口号,也可以自动选择. 手机配置代理: 1.连接wifi 2.找到该wifi--高级设置--配置代理: 三. ...
- spring配置和映射文件
配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www. ...
- W tensorflow/core/platform/cpu_feature_guard.cc:45]
W tensorflow/core/platform/cpu_feature_guard.cc:] The TensorFlow library wasn't compiled to use SSE3 ...
- Linux监控工具介绍系列——iostat
文章转自:https://www.cnblogs.com/ghj1976/p/5691857.html Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iost ...
- 基于 intellij IDEA 快速搭建Spring Boot项目
在<一步步搭建 Spring Boot maven 框架的工程>一文中,已经介绍了如何使用Eclipse快速搭建Spring Boot项目.由于最近将开发工具由Eclipse ...