前言
Dart中流程控制分为条件控制与循环控制。条件控制是根据条件选择代码块执行,流程控制是重复执行代码若干次直到满足终止条件而终止。可以理解为我们日常生活中的选择与重复问题。
一、条件语句
在我们的日常生活中,我们常常面临着大量的选择问题,如今天中午吃什么,今天要不要去爬山等,我们会根据一定的条件进行选择要去做什么。Dart中也是如此,可以根据一定的条件进行选择要执行的代码。
1.1 if语句
if语句用于简单的条件判断,类似生活中如果天气晴朗,就去爬山。
语法:
if(条件表达式){
// 执行的代码块
}
示例:
void main() {
String weather = '晴朗';
if(weather == '晴朗'){
print('我们就去爬山'); // 输出:我们就去爬山
}
}
1.2 if-else语句
if-else语句用于条件判断,根据布尔表达式选择是否执行。类似生活中如果天气晴朗,就去爬山,否则就待在家。
语法:
if(条件表达式){
// 条件表达式为true时执行的代码
}else{
// 条件表达式为false时执行的代码
}
示例:
void main() {
String weather = '小雨';
if(weather == '晴朗'){
print('我们就去爬山'); // 布尔表达式为false,不执行这段代码
}else{
print('待在家里面'); // 输出:待在家里面
}
}
1.3 if-else if-else 多分支语句
当有多个条件需要判断时使用多分支语句。类似生活中如果天气晴朗,去爬山,如果天气多云,去打麻将,否则就待在家。
语法:
if(条件表达式1){
// 条件表达式1为true时执行的代码
}else if(条件表达式2) {
// 条件表达式2为true时执行的代码
}else{
// 前面的条件表达式1,2结果都为false时执行
}
示例:
void main() {
String weather = '小雨';
if(weather == '晴朗'){
print('我们就去爬山'); // 条件不满足,不执行
}else if(weather == '多云') {
print('打麻将'); // 条件不满足,不执行
}else{
print('待在家里面'); // 输出:待在家里面
}
}
1.4 守卫语句
守卫语句是一种更加简洁的if语句写法。用于判断是否继续执行后续代码,若守卫语句不通过则不执行后续代码块。
语法:
if(条件表达式) return;
示例:
void main() {
String a = 'Dart';
String b = 'Java';
hello(a); // 输出:hello,Dart!
hello(b); // 没有输出,守卫语句中条件表达式为false,不执行后续的代码
}
void hello(String name){
if(name != 'Dart') return;
print('hello,$name!');
}
1.5 switch 语句
用于匹配一个表达式,根据与表达式的匹配结果执行相应的代码。适用于有限数量的离散值。 需要注意:
- 表达式内容不可为null,否则导致编译器错误。
- 表达式内容为字符串、枚举、整数等可比较的类型。
- 必须使用break,防止贯穿。
语法:
switch(表达式){
case 值1:
// 值1匹配表达式后执行的代码
break; // 防止贯穿
case 值2:
// 值2匹配表达式后执行的代码
break;
default:
// 上述值都不能匹配表达式时执行的代码
}
示例:
void main() {
String weather = '晴朗';
switch (weather){
case '晴朗':
print('去爬山');
break; // 防止贯穿
case '多云':
print('去打麻将');
break;
default:
print('待在家');
}
}
// 输出:去爬山,case 后面的值(晴朗)能够匹配到表达式内容。
1.6 条件表达式
简洁的if-else语句。
语法:
(条件表达式) ? (条件表达式为true时执行的代码) : (条件表达式为false时执行的代码);
示例:
void main() {
String weather = '小雨';
(weather == '晴朗') ? print('去爬山'):print('待在家里');
// 输出:待在家里
}
二、循环语句
循环语句:重复执行代码块若干次,直到终止条件满足,停止执行。就像我们生活中的学习一样,大量重复,直到我们学会为止。
2.1 for 循环
语法:
for(初始化表达式;条件表达式;更新表达式){
// 循环体,需要重复执行的代码块
}
流程如下图所示:
详细说明:
- 初始化表达式: 循环开始前执行一次;通常用于计数器变量的初始化;可以有1个或多个;位置可以在for循环外部;
- 条件表达式: 每次循环开始时进行判断,判断结果为true,执行循环体,判断结果为false,则退出循环。
- 更新表达式: 每次循环结束后执行;通常用于更新计数器变量;可以有1个或多个;位置可以在for循环内部。
- 循环体: 需要重复执行的代码块,会在每次循环时执行。
示例:
void main() {
for (int i=0;i<5;i++){
print('hello,Dart!');
}
}
// 输出:
hello,Dart!
hello,Dart!
hello,Dart!
hello,Dart!
hello,Dart!
2.2 增强for循环
用于遍历集合,使得代码更加清洁易读。
示例:
void main() {
List<int> a = [1, 2, 2, 5];
for (int i in a){
print(i);
}
}
// 输出:
1
2
2
5
2.3 while 循环
理解参考for循环。
语法:
while(条件表达式){
// 循环体
// 更新表达式
}
示例:
void main() {
int i = 0;
while(i<5){
print('hello,Dart!');
i++;
}
}
// 输出:
hello,Dart!
hello,Dart!
hello,Dart!
hello,Dart!
hello,Dart!
2.4 do-while 循环
适用于至少要执行一次的场景。
语法:
do{
// 循环体
// 更新表达式
}while(条件表达式);
示例:
void main() {
int i = 0;
do{
print('hello,Dart!');
i++;
}while(i<5);
}
// 输出:
hello,Dart!
hello,Dart!
hello,Dart!
hello,Dart!
hello,Dart!
三、跳转语句
提前跳出循环。
3.1 break 语句
立即退出当前循环。
示例:
void main() {
for (int i=0;i<5;i++){
if (i == 3){
break; // 当i=3时跳出循环
}
print('hello$i');
}
}
// 输出:
hello0
hello1
hello2 // 结果中没有打印hello3、hello4
3.2 continue 语句
退出本次循环,进入下一次的迭代。
示例:
void main() {
for (int i=0;i<5;i++){
if (i == 3){
continue; // 当i=3时跳出本次循环,不会再执行语句后面的代码
}
print('hello$i');
}
}
// 输出:
hello0
hello1
hello2
hello4 // 结果中没有打印hello3
3.3 标签
用于跳出指定循环层。
示例:
void main() {
tag:
for (int i=0;i<3;i++){
for (int j=0;j<3;j++){
if (i==1 && j==1){
break tag;
}
print('i:$i,j:$j');
}
}
}
// 输出:
i:0,j:0
i:0,j:1
i:0,j:2
i:1,j:0
四、注意
- if语句可以嵌套,但不建议嵌套过深。
- 循环语句可以嵌套。
- for循环的几种变体(初始化表达式,条件表达式,更新表达式的位置及个数变化)。
- 防止死循环出现。
五、总结
本小节从日常生活中的选择与重复问题出发介绍了条件语句与循环语句。其中条件语句介绍了if语句、if-else语句、if-else if-else语句、switch语句,循环语句介绍了for循环、增强for循环、while循环,do-while循环。