# Dart教程 - 3 语句

# 3.1 判断语句

判断在生活中无处不在,例如我们登录某个系统,需要判断密码是否正确,正确才能登录,否则登录失败。

# 1 if-else 语句

在 Dart 中通过 if else 来进行条件的判断,格式如下:

if (condition) {
  // condition为true时执行的代码块
} else {
  // condition为false时执行的代码块
}
1
2
3
4
5

也可以不需要 else

if (condition) {
    // 条件成立,要做的事情
}
1
2
3

if 后面的条件condition需要 bool 类型的值、变量或表达式,也就是 true 或 false 。

举个栗子,判断一个数是否为偶数:

void main() {
  
  int num = 5;
  if (num % 2 == 0) {
    print('$num 是偶数');
  } else {
    print('$num 是奇数');
  }
  
}
1
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之间");
}
1
2
3
4
5

如果 ifelse 后面只有一条语句,可以省略 {}

# 2 三目运算符

假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if else 语句,例如:

void main() {
  int a = 4;
  int b = 5;

  int max;
  if (a > b)
    max = a;
  else
    max = b;
  print("最大值为:$max");
}
1
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");
}
1
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时执行的语句块
}
1
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("不及格");
  }
}
1
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 时执行的代码块
}
1
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('错误的季节');
  }
}
1
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为真时执行的代码块
}
1
2
3

代码执行到while,会判断是否满足条件,如果满足,就会进入while循环,执行满足条件要做的事情,执行完成,会重新判断while后面的条件,如果满足会继续循环,如果不满足就不在进入循环。

回到一开始的提问:每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?

void main() {
  
  int i = 1;
  while (i <= 100) {
    print("第${i}天,送你一朵玫瑰花");
    i += 1;
  }
  
}
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;
  }
  
}
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}"); 		// 打印最终的结果
}
1
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);
1
2
3

举个栗子,再送一遍花:

void main() {
  
  int i = 1;
  
  do {
    print("第${i}天,送你一朵玫瑰花");
    i += 1;
  } while (i <= 100);
  
}
1
2
3
4
5
6
7
8
9
10

# 3 for 循环

for循环是一种常用的循环语句,可以指定循环变量的初始值、终止条件和步长。

for循环的语法如下:

# for 循环语法

for (var i = initialValue; i < limit; i += step) {
  // 循环体中的代码块
}
1
2
3

举个栗子:

void main() {
  
  for (var i = 1; i <= 5; i++) {
    print(i);
  }
  
}
1
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
  }
  
}
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++;
  }
}
1
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}");
    }
  }
  
}
1
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}");
  }
  
}
1
2
3
4
5
6
7
8
9
10
11

执行结果:

i=0 i=1 i=2 i=4

# 死循环

在使用while循环的时候,一定要注意判断条件,否则容易编程死循环。

例如,直接设置循环条件为True:

while (true) {
    print("死循环");
}
1
2
3

或者,忘记更新判断条件中的变量值,也会变成死循环:

int i = 0
while (i < 10) {
    print("死循环");
}
1
2
3
4

for 循环也可以写成死循环

for (;;) {
  print("死循环");
}
1
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('猜大了!');
    }
  }
}
1
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.writeprint 都是用于向控制台输出信息的函数,print 函数会自动换行,而 stdout.write 函数不会自动换行,它只是将指定的文本输出到控制台,而不会添加换行符。