一 . 运算符

以下列出 Dart 的运算符,从高到低按照优先级排列:

描述 运算符
一元运算符(后置) expr++ expr-- () [] . ?.
一元运算符(前置) -expr !expr ~expr ++expr --expr
乘法运算符 * / % ~/
加法运算符 + -
按位运算符 << >>
按位与 &
按位异或 ^
按位或 |
关系与类型检测 >= > <= < as is is!
平等 == !=
逻辑与 &&
逻辑或 ||
是否为null ??
三目运算符 expr1 ? expr2 : expr3
级联运算符 ..
赋值运算符 = *= /= ~/= %= += -= <<= >>= &= ^= |= ??=

使用运算符时,可以创建表达式。以下是运算符表达式的一些示例:

a++
a + b
a = b
a == b
c ? a : b
a is T

1 . 算术运算符

运算符 描述
+
-
-expr 一元运算减
*
/
~/ 除以,返回整数结果
% 获取整数除法的余数(模数)

Dart 也支持前置和后缀 递增、递减运算符。

例子:

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // Result is a double
assert(5 ~/ 2 == 2); // Result is an int
assert(5 % 2 == 1); // Remainder assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
运算符 描述
++var var = var + 1(表达式值是var + 1)
var++ var = var + 1(表达式值是var)
--var var = var – 1(表达式值是var – 1)
var-- var = var – 1(表达式值是var)

例子:

var a, b;

a = 0;
b = ++a; // Increment a before b gets its value.
assert(a == b); // 1 == 1 a = 0;
b = a++; // Increment a AFTER b gets its value.
assert(a != b); // 1 != 0 a = 0;
b = --a; // Decrement a before b gets its value.
assert(a == b); // -1 == -1 a = 0;
b = a--; // Decrement a AFTER b gets its value.
assert(a != b); // -1 != 0

2 . 比较运算符

运算符 描述
== 等于
!= 不等于
> 大于
< 小于
>= 大于或等于
<= 小于或等于

例子:

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

3 . ★★★★★类型检查运算符★★★★★

使用 as ,is 和 is !运算符可以方便地在运行时检查类型。

运算符 描述
as Typecast(也用于指定库前缀)
is 如果对象具有指定的类型,则为True
is! 如果对象具有指定的类型,则返回false

案例1:下面案例用于检测emp是否是Person类型:

if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}

案例2:下面案例emp的类型设置为Person类型;

(emp as Person).firstName = 'Bob';

提示

如果emp为null或不是Person,则案例1不执行任何操作,案例2会抛出异常。

4 . 赋值运算符

Dart 可以使用 = 运算符赋值。

// 把value 赋值给a
a = value;
// 如果b 为null 把 value 赋值给 b;否则b 保持不变。
b ??= value;

复合赋值运算符:

= –= /= %= >>= ^=
+= *= ~/= <<= &= |=

以下是复合赋值运算符的工作原理:

- 复合表达式 赋值表达式
复合表达式 a op= b a = a op b
例子 a += b a = a + b

例如:

var a = 2; // Assign using =
a *= 3; // Assign and multiply: a = a * 3
assert(a == 6);

5 . 逻辑运算符

运算符 描述
! 逻辑非
|| 逻辑与
&& 逻辑或

例如:

if (!done && (col == 0 || col == 3)) {
// ...Do something...
}

6 . 按位运算符合移位运算符

您可以在Dart中操纵数字的各个位。通常,您将使用这些按位和移位运算符和整数。

运算符 描述
& 按位或
| 按位与
^ 按位异或
~expr 按位取反
<< 左移
>> 右移

例如:

final value = 0x22;
final bitmask = 0x0f; assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR
assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right

7 . 条件表达式(三元表达式)

条件表达式 Dart有两个运算符,条件表达式可以用来简化 if-else语句。

  • condition ? expr1 : expr2

如果condition为true,则计算expr1(并返回其值); 否则,计算并返回expr2的值。

  • expr1 ?? expr2

如果expr1为非null,则返回其值; 否则,计算并返回expr2的值。

当您需要根据布尔表达式赋值时,请考虑使用?: :

var visibility = isPublic ? 'public' : 'private';

如果布尔表达式测试为null,请考虑使用?? :

String playerName(String name) => name ?? 'Guest';

前面的例子至少可以用其他两种方式编写,但不能简洁:

// 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';
}
}

8 . 级联运算符(链式编程)

级联运算符( ..),允许您对同一对象进行多项操作。

querySelector('#confirm') // 获取html元素对象
..text = 'Confirm' // 访问成员
..classes.add('important') // 添加样式
..onClick.listen((e) => window.alert('Confirmed!')); // 监听事件

上面的代码等同于:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

级联嵌套:

final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();

小心在返回实际对象的函数上构造级联。例如,以下代码失败:

var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.

sb.write()方法没有返回write成员方法。所以抛出异常,sb.write()必须也使用级联访问。

var sb = StringBuffer();
sb
..write('123')
..write('22'); print(sb); // 输出 => 12322

提示

严格来说,级联的“双点”符号不是运算符。它只是Dart语法的一部分。

9 . 其他运算符

运算符 名称 描述
() 函数调用 表示函数调用
[] List访问 引用列表中指定索引处的值
. 成员访问 访问对象的成员属性
?. 条件的成员访问 在不明确对象是否存在的情况下使用 ?. 访问对象的成员

?. 运算符使用案例:

class Test {
num member = 1;
} void main() {
var test = null;
print(test?.member); // 返回null 不会抛出异常
test = new Test();
print(test?.member); // 返回 1
}

二 . 流程控制

1 . 条件控制

A . if 和 else

if...else语句块的语法

if(boolean_expression){
// statement(s) will execute if the Boolean expression is true.
} else {
// statement(s) will execute if the Boolean expression is false.
}

流程图

Dart 支持 带有 if 和 else 的语句:

void main() {
var num = 12;
if (num % 2==0) {
print("偶数");
} else {
print("奇数");
}
}

输出结果

偶数

与JavaScript不同,条件必须使用布尔值。不能使用其他类型,但可以使用 null。

B . switch 和 case

switch语句计算表达式,并将表达式的值与case子句指定的值匹配,然后执行与该case相关的语句。

switch/case语句的语法

switch(variable_expression) {
case constant_expr1: {
// statements;
}
break;
case constant_expr2: {
//statements;
}
break; default: {
//statements;
}
break;
}
  • switch中可以有任意数量的case语句。
  • case语句只能包含常量,它不能是变量或表达式。
  • variable_expression和常量表达式的数据类型必须匹配。
  • 除非你在每个代码块之后放置break语句,否则执行会流入下一个break块。
  • case表达式必须是唯一的。
  • default块是可选的。

流程图

void main() {
var grade = "A";
switch(grade) {
case "A": { print("相当牛逼"); }
break;
case "B": { print("厉害"); }
break;
case "C": { print("一般"); }
break;
case "D": { print("二愣子"); }
break;
default: { print("Invalid choice"); }
break;
}
}

结果输出

相当牛逼

该示例根据常量集(A,B,C,D和E)验证变量等级的值,并执行相应的块。如果变量中的值与上面提到的任何常量都不匹配,则将执行默认(default)块。

2 . 循环控制

循环的分类

A . for 循环和for…in循环

for循环

for循环是一个确定循环的实现,用于执行代码块指定的次数。

for循环的语法

for (initial_count_value; termination-condition; step) {
//statements
}

示例

void main() {
var num = 5;
var factorial = 1; for( var i = num ; i >= 1; i-- ) {
factorial *= i ;
}
print(factorial);
}

输出结果

120

for...in循环

一般用于循环对象的属性

for...in循环的语法

for (variablename in object){
statement or block to execute
}

示例

void main() {
var obj = [12,13,14]; for (var prop in obj) {
print(prop);
}
}

输出结果

12
13
14

B . while 和 do-while 循环

while循环

流程图

while循环的语法

while (expression) {
Statement(s) to be executed if expression is true
}

示例

void main() {
var num = 5;
var factorial = 1; while(num >=1) {
factorial = factorial * num;
num--;
}
print("The factorial is ${factorial}");
}

输出结果

The factorial is 120

do...while循环

do...while循环中至少执行代码块一次

流程图

do-while循环的语法

do {
Statement(s) to be executed;
} while (expression);

示例

void main() {
var n = 10;
do {
print(n);
n--;
}
while(n>=0);
}

输出结果

10
9
8
7
6
5
4
3
2
1
0

C . break 和 continue

使用 break 停止程序循环

示例

void main() {
var i = 1;
while(i<=10) {
if (i % 5 == 0) {
print("The first multiple of 5 between 1 and 10 is : ${i}");
break ;
//exit the loop if the first multiple is found
}
i++;
}
}

输出结果

The first multiple of 5 between 1 and 10 is: 5

使用 continue 跳转到下一次迭代

示例

void main() {
var num = 0;
var count = 0; for(num = 0;num<=20;num++) {
if (num % 2==0) {
continue;
}
count++;
}
print(" The count of odd values between 0 and 20 is: ${count}");
}

输出结果

The count of odd values between 0 and 20 is: 10

3 . forEach()循环

如果对象实现了 Iterable 接口的对象,可以使用 forEach()接口 (例如,list 或者 set)

main() {
List list = [123, '123', 'postbird'];
list.forEach((f)=> print(f));
}

输出结果

123
123
postbird

4 . 断言 Assert

如果 assert 语句中的布尔条件为 false , 那么正常的程序执行流程会被中断。 assert 语句只在开发环境中有效, 在生产环境是无效的;

// 确认变量值不为空。
assert(text != null);
// 确认变量值小于100。
assert(number < 100);
// 确认 URL 是否是 https 类型。
assert(urlString.startsWith('https'));

欢迎扫面下列二维码关注“余弦的自留地”公众微信号



万物之中,希望至美

Dart:3.Dart运算符、流程控制的更多相关文章

  1. python的学习笔记01_3 基本运算符 流程控制if while 字符串常用办法

    基本运算符 运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运 ...

  2. day04 运算符 流程控制 (if while/of)

    1. 运算符算数运算符 + - * / int / float :数字类型 # print(10 + 3.1)# print(10 / 3)# print(10 // 3)# print(10 % 3 ...

  3. <基础> PHP 运算符 流程控制

    PHP运算符优先级: 递增/递减 (++ / --) > 算术运算符(+ .- .* ./) > 大小比较 > 逻辑与 (&)> 逻辑或(||) > 三目 > ...

  4. python - 用户交互/数据类型/格式化输出/运算符/流程控制单双多分支

    python:用户交互: 等用户输入,做反应: username=input("username:")password=input("password:")pr ...

  5. day52类型转换 运算符 流程控制

    0.复习 1.导入 <div id="div1" onclick="this.style.color = 'red';">12345</div ...

  6. JAVA:变量,数据类型,运算符,流程控制(简介)<1>

    一.安装和配置jdk 1.jdk是什么? (1).jdk全称是Java Development Kit, Java开发工具包; (2).jdk是sun公司开发的; (3).jdk主要包括:jre(Ja ...

  7. Java学习第一篇:变量,数据类型,运算符,流程控制(简介)

    一.安装和配置jdk 1.jdk是什么? (1).jdk全称是Java Development Kit, Java开发工具包; (2).jdk是sun公司开发的; (3).jdk主要包括:jre(Ja ...

  8. java基础语法2-运算符与流程控制

    关键字-标识符-常量和变量-运算符-流程控制-方法-数组 5 运算符 算术运算符Arithmetic Operators 赋值运算符Assignment Operators 比较运算符Compare ...

  9. JavaScript 运算,流程控制和循环

    算数运算符 算术运算符 描叙 运算符 实例 加 + 10 + 20 = 30 减 - 10 – 20 = -10 乘 * 10 * 20 = 600 除 / 10 / 20 = 0.5 取余数 % 返 ...

随机推荐

  1. 倒计时3天!i春秋四周年盛典狂欢,钜惠不停

    六月注定是不平凡的 感恩父亲节 父爱如山亦如海 难忘毕业季 青春无悔不散场 嗨购618 优惠福利送不停 更值得期待的是 在这个不平凡的六月 迎来了i春秋四周年庆典 当周年庆遇到618 会擦出怎样的火花 ...

  2. SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错

    SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...

  3. Windows 10 Java开发环境配置

    一.JDK下载 安装java开发环境,第一步就是下载jdk安装包.打开浏览器进入oracle官网下载.这里注意jdk和jre的区别,jdk(java develop environment)是java ...

  4. 高性能TcpServer(C#) - 4.文件通道(处理:文件分包,支持断点续传)

    高性能TcpServer(C#) - 1.网络通信协议 高性能TcpServer(C#) - 2.创建高性能Socket服务器SocketAsyncEventArgs的实现(IOCP) 高性能TcpS ...

  5. 深入理解JVM虚拟机(一):JVM运行时数据区

    概述: JVM将内存的管理进行封装,使得开发人员不必关心内存申请.释放操作.但是在高级程序开发.复杂业务场景开发的时候,如果出现内存溢出的情况,对于开发人员而言就很难去分析出原因.所以还是很有必要去了 ...

  6. DV型、OV型、EV型证书的主要区别

    DV型和OV型证书的区别 DV和OV型证书最大的差别是:DV型证书不包含企业名称信息:而OV型证书包含企业名称信息,以下是两者差别对比表:    DV OV  包含企业名称信息 否 是  验证公司名称 ...

  7. testlink 1.9.19安装

    环境平台: 系统:Centos 7.6 数据库:mysql 5.7 PHP版本:PHP 5.6 testlink版本:testlink- 链接:https://pan.baidu.com/s/10Pr ...

  8. centos7 yum 安装lnmp

    centos7 yum 安装lnmp   安装7.2把7.1改成7.2就行 使用第三方扩展epel源安装php7.2 #移除旧版php [root@web02 ~]# yum remove php-m ...

  9. 李宏毅-Network Compression课程笔记

    一.方法总结 Network Pruning Knowledge Distillation Parameter Quantization Architecture Design Dynamic Com ...

  10. LVS(二):四种工作模型

    面试的时候必问这个四种工作模式,因为这几乎是企业里面必用的内容,所以一定要将其理解通透. 一.lvs-nat模式 二.LVS-DR模式(默认) 三.LVS-tun模式 四.LVS-fullnat模式 ...