# Dart教程 - 3 语句
# 3.1 判断语句
判断在生活中无处不在,例如我们登录某个系统,需要判断密码是否正确,正确才能登录,否则登录失败。

# 1 if-else 语句
在 Dart 中通过 if else 来进行条件的判断,格式如下:
if (condition) {
  // condition为true时执行的代码块
} else {
  // condition为false时执行的代码块
}
2
3
4
5
也可以不需要 else:
if (condition) {
    // 条件成立,要做的事情
}
2
3
if 后面的条件condition需要 bool 类型的值、变量或表达式,也就是 true 或 false 。
举个栗子,判断一个数是否为偶数:
void main() {
  
  int num = 5;
  if (num % 2 == 0) {
    print('$num 是偶数');
  } else {
    print('$num 是奇数');
  }
  
}
2
3
4
5
6
7
8
9
10
执行结果:
5 是奇数
一般情况下,我们通过 关系运算 和 逻辑运算 得到 bool 结果。
举个栗子:
void main() {
  int a = 5;
  if (a > 0 && a < 10)
    print("a在0~10之间");
}
2
3
4
5
如果 if 或 else 后面只有一条语句,可以省略 {}
# 2 三目运算符
假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if else 语句,例如:
void main() {
  int a = 4;
  int b = 5;
  int max;
  if (a > b)
    max = a;
  else
    max = b;
  print("最大值为:$max");
}
2
3
4
5
6
7
8
9
10
11
我们可以使用三目运算符来完成上面的功能,代码会更简洁的写法:
void main() {
  int a = 4;
  int b = 5;
  int max = a > b ? a : b;
  print("最大值为:$max");
}
2
3
4
5
6
7
int max = a > b ? a : b; 的意思是:先判断 a > b,如果成立,就返回a,不成立就返回b。
代码简洁了确实很多。
# 3 if-elseif-else 语句
if-else 只能进行是和否的判断。
if-elseif-else 可以进行多条件判断。
语法格式:
if (condition1) {
  // condition1为true时执行的语句块
} else if (condition2) {
  // condition2为true时执行的语句块
} else {
  // 所有条件都为false时执行的语句块
}
2
3
4
5
6
7
else-if 可以有多个,最后的 else 可以省略。
当满足一个条件后,其他的条件就不会再判断了,如果所有条件都不满足,会执行else。
下面通过练习来举个栗子:
给出成绩,经过判断,打印出输入的成绩是优秀、良好、中等、及格还是不及格。
void main() {
  int score = 85;
  if (score < 0 || score > 100) {
    print("成绩不正确");
  } else if (score >= 90) {
    print("优秀");
  } else if (score >= 80) {
    print("良好");
  } else if (score >= 70) {
    print("中等");
  } else if (score >= 60) {
    print("及格");
  } else {
    print("不及格");
  }
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if-else语句都是可以相互嵌套的,可以在 if-else 判断中再进行 if-else 判断。
# 4 switch语句
switch语句也是一种判断语句,通常用于对多个可能的值进行比较。switch语句的语法如下:
switch (value) {
  case value1:
    // value == value1 时执行的代码块
    break;
  case value2:
    // value == value2 时执行的代码块
    break;
  default:
    // value 不等于上面所有的case 时执行的代码块
}
2
3
4
5
6
7
8
9
10
以下是一个示例代码,通过数字判断季节:
void main() {
  
  int day = 2;
  switch (day) {
    case 1:
      print('春季');
      break;
    case 2:
      print('夏季');
      break;
    case 3:
      print('秋季');
      break;
    case 4:
      print('冬季');
      break;
    default:
      print('错误的季节');
  }
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
执行结果:
夏季
注意,每个case后,都需要进行break或return,否则代码会报错。
# 3.2 循环语句
循环在日常生活中也很常见,例如我们要重复做某件事,就需要用到循环,循环不停的做某件事。

举个栗子,每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?
# 1 while 循环
可以使用While进行循环操作。
while循环的语法:
while (condition) {
  // condition为真时执行的代码块
}
2
3
代码执行到while,会判断是否满足条件,如果满足,就会进入while循环,执行满足条件要做的事情,执行完成,会重新判断while后面的条件,如果满足会继续循环,如果不满足就不在进入循环。
回到一开始的提问:每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?
void main() {
  
  int i = 1;
  while (i <= 100) {
    print("第${i}天,送你一朵玫瑰花");
    i += 1;
  }
  
}
2
3
4
5
6
7
8
9
首先我们定义了一个变量 i ,用来记录当前是第几天。
我们一开始定义了 i 为 1,指定到while循环时,先判断 i 是否小于等于100,如果小于等于100,则进入到循环,打印语句,然后将 i 加1,然后再执行while后面的条件判断,判断 i <= 100,这样一直循环执行,当 i = 101时,刚好已经执行了100次,且不再满足 i < =100,此时终止循环。
注意,一定要对 i 进行累加,如果 i 不进行累加,永远会满足 i <= 100,那么循环将永远不会结束,变成死循环。
执行结果:
第1天,送你一朵玫瑰花
第2天,送你一朵玫瑰花
……
第99天,送你一朵玫瑰花
第100天,送你一朵玫瑰花
我们在计数的时候,i 也可以从0开始,例如:
void main() {
  
  int i = 0;
  while (i < 100) {
    print("第${i + 1}天,送你一朵玫瑰花");
    i += 1;
  }
  
}
2
3
4
5
6
7
8
9
判断的条件的设定是很灵活的,根据实际需求来就可以了,不是一成不变的。
练习:计算从1累加到100的和
void main() {
  
  int sum = 0; 										// 定义一个变量,存储累加的和
  int i = 1; 											// 定义一个变量,标识累加到几了,从1开始累加
  while (i <= 100) {
    sum += i; 										// 将和累加
    i += 1; 											// 将i加1,继续累加
  }
  print("1~100的和为:${sum}"); 		// 打印最终的结果
}
2
3
4
5
6
7
8
9
10
11
12
执行结果:
1~100的和为:5050
# 2 do-while 循环
do...while循环与while循环的区别在于,do...while循环先执行一次循环体中的代码,再检查条件是否为真。如果条件为真,则继续执行循环体中的代码。
do...while循环的语法如下:
do {
  // 循环体中的代码块
} while (condition);
2
3
举个栗子,再送一遍花:
void main() {
  
  int i = 1;
  
  do {
    print("第${i}天,送你一朵玫瑰花");
    i += 1;
  } while (i <= 100);
  
}
2
3
4
5
6
7
8
9
10
# 3 for 循环
for循环是一种常用的循环语句,可以指定循环变量的初始值、终止条件和步长。
for循环的语法如下:
# for 循环语法
for (var i = initialValue; i < limit; i += step) {
  // 循环体中的代码块
}
2
3
举个栗子:
void main() {
  
  for (var i = 1; i <= 5; i++) {
    print(i);
  }
  
}
2
3
4
5
6
7
先执行 var i = 1,定义一个变量 i ,然后执行 i <= 5 ,判断 i 是否小于等于5,如果为 true,则执行循环体中的代码 print(i); ,执行完循环体中的代码,执行 i++ ,然后再次执行 i <= 5 ,判断i 是否小于等于5,直到  i <= 5 不满足,则终止循环。
打印结果:
1
2
3
4
5
# 4 循环嵌套
循环是可以相互嵌套的,while和for循环中可以再次嵌套while和for循环。
例如每天给小红送10多玫瑰花,坚持100天。
void main() {
  
  int day = 1; // 记录第几天
  while (day <= 100) {			// 外层循环用于循环天数
    
    for (int roseCount = 1; roseCount <= 10; roseCount++) {			// 内层循环用于循环花的朵数
      
      print("第${day}天,第${roseCount}朵玫瑰花");
    }
    day += 1; // 天数+1
  }
  
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 5 中断循环
我们在前面终止循环,主要是靠不满足条件时自动跳出。这样的话,必须每一次的循环都执行完成,到达条件判断的时候才能跳出。
但是有时候,我们不得不提前退出循环,或者终止当前的循环继续后面的循环,这个时候就需要break和continue关键字了。
# break 语句
break 关键字用于直接结束当前所在的循环。
举个栗子:
如果一个循环,想在执行第三次的时候跳出:
void main() {
  int i = 0;
  while (i < 10) {
    if (i == 3) {
      break;
    }
    print("i=${i}");
    i++;
  }
}
2
3
4
5
6
7
8
9
10
11
执行结果:
i=0 i=1 i=2
可以看到 i = 3 时,跳出了循环。
break只会跳出其所在的循环
void main() {
  
  for (int i = 0; i < 10; i++) {
    for (int j = 0; i < 10; j++) {
      if (j == 3) {
        break;
      }
      print("i=${i}, j=${j}");
    }
  }
  
}
2
3
4
5
6
7
8
9
10
11
12
13
上面的代码,break只能跳出内部的那一个循环。
# continue 语句
continue的作用是中断本次循环,直接进入下一次循环。
举个栗子:
循环5次,在第三次的时候跳过,继续后面的执行:
void main() {
  
  for (int i = 0; i < 5; i++) {
    if (i == 3) {
      continue;
    }
    print("i=${i}");
  }
  
}
2
3
4
5
6
7
8
9
10
11
执行结果:
i=0 i=1 i=2 i=4
# 死循环
在使用while循环的时候,一定要注意判断条件,否则容易编程死循环。
例如,直接设置循环条件为True:
while (true) {
    print("死循环");
}
2
3
或者,忘记更新判断条件中的变量值,也会变成死循环:
int i = 0
while (i < 10) {
    print("死循环");
}
2
3
4
for 循环也可以写成死循环
for (;;) {
  print("死循环");
}
2
3
死循环不一定是不对的,有时候我们还需要死循环帮我们做一些事情,要根据实际需求来。
# 6 练习
随机生成一个1-100的整数,然后在键盘输入数字来猜,猜不对,提示大了还是小了,猜对了,跳出循环。
在这里我们需要生成一个随机数,需要用到一个包 dart:math,需要键盘输入,需要用到 dart:io 包。
所以需要引入生成随机数的包,使用 import random 来引入,然后使用 randint 函数来生成一个 1~100 的整数。
import 'dart:io';
import 'dart:math';
void main() {
  var random = Random();
  // 随机生成1-100的目标数
  var goal = random.nextInt(100) + 1;
  while (true) {
    stdout.write("请猜随机数的大小:");
    // 读取键盘输入
    var input = stdin.readLineSync();
    // 键盘输入的是字符串,转换为整数,如果值是空,则将''传递给tryParse()方法,??运算符后面再讲解
    var value = int.tryParse(input ?? '');
    if (value == null || value < 1 || value > 100) {
      print('请输入1-100之间的整数!');
      continue;
    }
    if (value == goal) {
      print('猜对了!');
      break;
    } else if (value < goal) {
      print('猜小了!');
    } else {
      print('猜大了!');
    }
  }
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
stdout.write() 和 print() 的区别:
stdout.write 和 print 都是用于向控制台输出信息的函数,print 函数会自动换行,而 stdout.write 函数不会自动换行,它只是将指定的文本输出到控制台,而不会添加换行符。
