dart学习第 2 节:运算符与流程控制 —— 程序的 “逻辑引擎”

今天我们要深入了解让程序 "动起来" 的核心 ------运算符与流程控制,它们就像程序的 "逻辑引擎",驱动着程序按照我们设定的规则运行。

一、运算符:数据的 "处理器"

运算符用于对数据进行操作,Dart 中的运算符种类丰富,我们主要学习以下几类:

1. 算术运算符

用于执行基本的数学运算。

运算符 名称 示例 说明
+ 5 + 38 两数相加
- 5 - 32 两数相减
* 5 * 315 两数相乘
/ 5 / 31.666... 两数相除,结果为浮点数
~/ 整除 5 ~/ 31 两数相除,只保留整数部分
% 取余(模) 5 % 32 两数相除后的余数
++ 自增 a++++a 变量值加 1,前者先使用后加,后者先加后使用
-- 自减 a----a 变量值减 1,规则同自增

示例代码

dart 复制代码
void main() {
  int a = 10;
  int b = 3;

  print(a + b); // 输出:13
  print(a - b); // 输出:7
  print(a * b); // 输出:30
  print(a / b); // 输出:3.3333333333333335
  print(a ~/ b); // 输出:3
  print(a % b); // 输出:1

  int c = 5;
  print(c++); // 输出:5(先打印c的值,再让c加1)
  print(c); // 输出:6
  print(++c); // 输出:7(先让c加1,再打印c的值)
}

2. 关系运算符

用于比较两个值之间的关系,返回结果为布尔值(truefalse)。

运算符 名称 示例
== 等于 5 == 3false
!= 不等于 5 != 3true
> 大于 5 > 3true
< 小于 5 < 3false
>= 大于等于 5 >= 5true
<= 小于等于 3 <= 2false
示例代码
dart 复制代码
void main() {
  int x = 7;
  int y = 7;

  print(x == y);  // 输出:true
  print(x != y);  // 输出:false
  print(x > y);   // 输出:false
  print(x <= y);  // 输出:true
}

3. 逻辑运算符

用于组合多个布尔表达式,进行逻辑判断。

运算符 名称 说明 示例(假设 a=true, b=false
&& 逻辑与 两边都为 true, 结果才为 true a && bfalse
|| 逻辑或 至少一边为 true, 结果就为 true `a
! 逻辑非 取反,truefalsefalsetrue !afalse

示例代码

dart 复制代码
void main() {
  bool isSunny = true;
  bool isWarm = false;

  // 逻辑与:是否晴天且暖和?
  print(isSunny && isWarm); // 输出:false

  // 逻辑或:是否晴天或暖和?
  print(isSunny || isWarm); // 输出:true

  // 逻辑非:是否不是晴天?
  print(!isSunny); // 输出:false

  // 组合使用:判断一个数是否在1到10之间(包含1和10)
  int num = 5;
  bool isBetween = num >= 1 && num <= 10;
  print(isBetween); // 输出:true
}

4. 重点:?? 空合并运算符(入门)

在 Dart 中,我们可以声明可空类型的变量(后面加 ?)。?? 运算符用于处理可能为 null 的值,它的作用是:如果左边的表达式不为 null,则返回左边的值;否则返回右边的值。

示例代码

dart 复制代码
void main() {
  String? name;  // 可空字符串,初始值为 null
  String displayName = name ?? "Guest";  // name 是 null,所以取 "Guest"
  print(displayName);  // 输出:Guest

  name = "Alice";
  displayName = name ?? "Guest";  // name 不是 null,所以取 "Alice"
  print(displayName);  // 输出:Alice
}

这个运算符在实际开发中非常有用,可以简洁地为可能为空的变量设置默认值,避免 null 引起的错误。


二、分支结构:程序的 "岔路口"

分支结构让程序可以根据不同的条件执行不同的代码块。

1. if-else 语句

最常用的分支结构,语法如下:

dart 复制代码
if (条件表达式) {
  // 条件为 true 时执行的代码
} else if (另一个条件表达式) {
  // 上面条件为 false,且此条件为 true 时执行的代码
} else {
  // 所有条件都为 false 时执行的代码
}

else ifelse 都是可选的。

示例 1:简单的 if-else

dart 复制代码
void main() {
  int score = 85;

  if (score >= 60) {
    print("考试通过!");
  } else {
    print("考试未通过,继续努力!");
  }
  // 输出:考试通过!
}

示例 2:多分支 if-else if-else

dart 复制代码
void main() {
  int grade = 75;

  if (grade >= 90) {
    print("优秀");
  } else if (grade >= 80) {
    print("良好");
  } else if (grade >= 60) {
    print("及格");
  } else {
    print("不及格");
  }
  // 输出:及格
}

2. switch-case 语句

switch-case 语句适用于变量与多个常量值进行比较的场景。语法如下:

dadrt 复制代码
switch (表达式) {
  case 常量1:
    // 表达式的值等于常量1时执行
    break;  // 跳出 switch 语句
  case 常量2:
    // 表达式的值等于常量2时执行
    break;
  // ... 更多 case
  default:
    // 表达式的值与所有 case 都不匹配时执行(可选)
}
  • case 后面必须跟常量。
  • break 用于防止代码继续执行到下一个 case(穿透现象),如果确实需要穿透,可以使用 continue 配合标签。
  • default 类似于 else

示例代码

dart 复制代码
void main() {
  String day = "Monday";

  switch (day) {
    case "Monday":
      print("星期一,新的一周开始了!");
      break;
    case "Friday":
      print("星期五,周末快到了!");
      break;
    case "Saturday":
    case "Sunday": // 多个 case 可以执行相同的代码
      print("周末,休息一下吧!");
      break;
    default:
      print("工作日,加油工作!");
  }
  // 输出:星期一,新的一周开始了!
}

三、循环结构:程序的 "重复器"

循环结构用于重复执行一段代码,直到满足特定条件。

1. for 循环

语法灵活,应用广泛,语法如下:

dart 复制代码
for (初始化表达式; 条件表达式; 迭代表达式) {
  // 循环体:条件为 true 时执行
}
  • 初始化表达式:在循环开始前执行一次,通常用于初始化循环变量。
  • 条件表达式:每次循环前判断,为 true 则执行循环体,为 false 则退出循环。
  • 迭代表达式:每次循环体执行完后执行,通常用于更新循环变量。

示例 1:基本 for 循环(打印 0 到 4)

dart 复制代码
void main() {
  for (int i = 0; i < 5; i++) {
    print(i);
  }
  // 输出:0, 1, 2, 3, 4(每行一个)
}

示例 2:遍历列表(for-in 循环)

Dart 提供了更简洁的 for-in 循环来遍历可迭代对象(如列表):

dart 复制代码
void main() {
  List<String> fruits = ["苹果", "香蕉", "橙子"];

  for (String fruit in fruits) {
    print(fruit);
  }
  // 输出:苹果, 香蕉, 橙子(每行一个)
}

2. while 循环和 do-while 循环

  • while 循环:先判断条件,条件为 true 才执行循环体。
dart 复制代码
while (条件表达式) {
  // 循环体
}
  • do-while 循环:先执行一次循环体,再判断条件,条件为 true 则继续循环(至少执行一次)。
dart 复制代码
do {
  // 循环体
} while (条件表达式);

示例 1:while 循环(计算 1 到 10 的和)

dart 复制代码
void main() {
  int sum = 0;
  int i = 1;

  while (i <= 10) {
    sum += i; // 等价于 sum = sum + i
    i++;
  }

  print("1到10的和是:$sum"); // 输出:1到10的和是:55
}

示例 2:do-while 循环(简单的输入验证)

dart 复制代码
import 'dart:io'; // 用于读取控制台输入

void main() {
  int age;
  do {
    print("请输入你的年龄(必须大于0):");
    String? input = stdin.readLineSync(); // 读取输入
    age = int.tryParse(input ?? "") ?? 0; // 转换为整数,失败则为0
  } while (age <= 0);

  print("你的年龄是:$age");
}

这段代码会一直要求用户输入,直到输入一个大于 0 的整数。

3. break 和 continue 语句

  • break:用于立即跳出当前循环(终止循环)。
  • continue:用于跳过当前循环中剩余的代码,直接进入下一次循环。

示例 1:break 的使用(找到目标就停止)

dart 复制代码
void main() {
  List<int> numbers = [3, 7, 12, 5, 9];
  int target = 12;
  bool found = false;

  for (int num in numbers) {
    if (num == target) {
      found = true;
      break; // 找到目标,跳出循环
    }
  }

  print(found ? "找到了目标!" : "未找到目标!"); // 输出:找到了目标!
}

示例 2:continue 的使用(跳过偶数)

dart 复制代码
void main() {
  for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
      // 如果是偶数
      continue; // 跳过当前循环的剩余部分,进入下一次循环
    }
    print(i); // 只打印奇数
  }
  // 输出:1, 3, 5, 7, 9(每行一个)
}

四、补充:运算符的优先级

当一个表达式中包含多个运算符时,运算的先后顺序由运算符的优先级决定。比如,乘法和除法的优先级高于加法和减法。如果不确定优先级,可以使用括号 () 来改变运算顺序,括号内的表达式会优先计算。

示例

dart 复制代码
void main() {
  print(2 + 3 * 4); // 先算乘法:3*4=12,再算加法:2+12=14 → 输出:14
  print((2 + 3) * 4); // 先算括号内的加法:2+3=5,再算乘法:5*4=20 → 输出:20
}
相关推荐
MonkeyKing2 天前
三棵树彻底拆解(Widget / Element / RenderObject)
flutter·dart
哈撒Ki4 天前
快速入门 Dart 语言
前端·flutter·dart
天渺工作室7 天前
Flutter 版的 NVM——FVM 使用指南
flutter·dart
Nathan202406168 天前
Flutter - InheritedWidget
flutter·dart
空中海9 天前
2.3 组件复用与组合
flutter·dart
空中海12 天前
3.3 第三方框架
flutter·dart
空中海13 天前
2.7 列表与滚动性能优化
flutter·性能优化·dart
空中海13 天前
2.4 绘制与动画
flutter·dart
空中海13 天前
2.6 表单与输入处理
flutter·dart
空中海13 天前
1.1 Flutter 简介与架构原理
flutter·dart