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
}
相关推荐
cowice2 天前
Dart基础知识
flutter·dart
AhhhhDong9 天前
记录工作中遇到的几个Dart语言的坑和bug
dart
叽哥14 天前
Flutter面试:Dart基础2
flutter·面试·dart
fouryears_2341718 天前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
华科云商xiao徐23 天前
异步并发×编译性能:Dart爬虫的实战突围
爬虫·数据可视化·dart
dragon72523 天前
dart以同步方式调用异步函数引发的时序bug
dart
叽哥1 个月前
dart学习第 24 节:核心特性实战 —— 天气 API 数据解析
flutter·dart
叽哥1 个月前
dart学习第 23 节: 单元测试入门 —— 保证代码质量
flutter·dart
叽哥1 个月前
dart学习第 22 节:性能优化基础 —— 从代码层面提速
flutter·dart
叽哥1 个月前
dart学习第 20 节:错误处理与日志 —— 让程序更健壮
flutter·dart