今天我们要深入了解让程序 "动起来" 的核心 ------运算符与流程控制,它们就像程序的 "逻辑引擎",驱动着程序按照我们设定的规则运行。
一、运算符:数据的 "处理器"
运算符用于对数据进行操作,Dart 中的运算符种类丰富,我们主要学习以下几类:
1. 算术运算符
用于执行基本的数学运算。
运算符 | 名称 | 示例 | 说明 |
---|---|---|---|
+ | 加 | 5 + 3 → 8 |
两数相加 |
- | 减 | 5 - 3 → 2 |
两数相减 |
* | 乘 | 5 * 3 → 15 |
两数相乘 |
/ | 除 | 5 / 3 → 1.666... |
两数相除,结果为浮点数 |
~/ | 整除 | 5 ~/ 3 → 1 |
两数相除,只保留整数部分 |
% | 取余(模) | 5 % 3 → 2 |
两数相除后的余数 |
++ | 自增 | 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. 关系运算符
用于比较两个值之间的关系,返回结果为布尔值(true
或 false
)。
运算符 | 名称 | 示例 |
---|---|---|
== | 等于 | 5 == 3 → false |
!= | 不等于 | 5 != 3 → true |
> | 大于 | 5 > 3 → true |
< | 小于 | 5 < 3 → false |
>= | 大于等于 | 5 >= 5 → true |
<= | 小于等于 | 3 <= 2 → false |
示例代码: |
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 && b → false |
|| | 逻辑或 | 至少一边为 true , 结果就为 true |
`a |
! | 逻辑非 | 取反,true 变 false , false 变 true |
!a → false |
示例代码:
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 if
和 else
都是可选的。
示例 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
}