前言
流程控制——构建灵活、智能且高效应用程序的基石。
流程控制决定了程序的执行路径,使得代码可以根据不同的条件和输入做出响应,从而实现复杂而多变的逻辑需求。掌握流程控制结构不仅是编写功能丰富的应用的基础,也是提高代码可读性和维护性、优化代码性能的核心技能。
如果说运算符是代码逻辑的半壁江山,那流程控制 就是另外一半。流程控制包括:
1、条件控制:
根据不同的条件选择性执行特定的代码块。2、循环控制:
可以执行某个代码块若干次,直到符合终止条件而结束。
操千曲而后晓声,观千剑而后识器。虐它千百遍方能通晓其真意。
一、条件语句
1.1、if-else语句
最常用的条件语句,允许根据布尔表达式的值来决定是否执行某段代码。
- 基本语法及示例:
void ifElse(){
//1、基本语法
/*
if (布尔表达式) {
// 如果条件为 true,则执行该代码块
} else {
// 如果条件为 false,则执行该代码块
}
*/
//2、代码示例
//金石活动计划最低等级
double goldLevel = 4;
double myLevel = 3;
if(myLevel >= goldLevel){
print("可以参加金石计划活动");
} else {
print("不可以参加金石计划活动");
}
}
输出:不可以参加金石计划活动
1.2、多分支if-else if-else
当有多个条件需要判断时,可以使用 else if 实现多分支逻辑。
- 基本语法及示例:
void ifElseIf(){
//1、基本语法
/*
if (布尔表达式) {
// 执行代码块1
} else if (布尔表达式){
// 执行代码块2
} else {
// 执行默认代码块
}
*/
//2、代码示例
//金石活动计划最低等级
double goldLevel = 4;
//创作者活动计划最低等级
double createLevel = 3;
double myLevel = 3;
if(myLevel >= goldLevel){
print("可以参加金石计划活动");
} else if (myLevel >= createLevel){
print("可以参加创作者计划活动");
} else {
print("不可以参加上述两种活动");
}
}
输出:可以参加创作者计划活动
1.3、简洁的 if 语句
有时只需要在条件为 true 时执行某些操作,而不需要 else 分支。
- 基本语法及示例:
void ifTest(){
//1、基本语法
/*
if (布尔表达式) {
// 如果条件为 true,则执行该代码块
}
*/
//2、代码示例
//掘金最高等级
double maxLevel = 8;
double myLevel = 8;
if(myLevel >= maxLevel){
print("可以参加掘金所有的活动");
}
}
输出:可以参加掘金所有的活动
1.4、switch语句
用于匹配一个表达式的值,并根据匹配的结果执行相应的代码块。它适用于有限数量的离散值。
- 基本语法:
switch (expression) {
case value1:
// 执行代码块 1
break;
case value2:
// 执行代码块 2
break;
default:
// 默认执行代码块
}
- 注意事项
- 必须使用
break:每个case后面通常需要跟一个break语句,以防止“贯穿”(fall-through)到下一个case。 - 支持类型:支持
整数、字符串、枚举等可比较类型。 - 不可为空:表达式不能为
null,否则会导致编译错误。
- 必须使用
- 示例代码:
void testSwitch() {
String command = "CLOSE";
switch (command) {
case "OPEN":
print("Opening the door.");
break;
case "CLOSE":
print("Closing the door.");
break;
default:
print("Unknown command.");
}
}
输出:Closing the door.
1.5、条件表达式(?:)
一种简洁的条件判断方式,适用于简单的条件赋值。
int age = 20;
String message = (age >= 18) ? "Adult" : "Minor";
print(message); // 输出: Adult
二、循环语句
编程语言之间的循环控制都是相同的功能,此处不做过多的赘述,详细内容可查看这篇文章 深入理解C语言之for循环 。
三、跳转语句
3.1、break语句
用于立即退出当前的循环。
void testBreak() {
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 退出循环
}
print(i);
}
}
输出: 0, 1, 2, 3, 4
3.2、continue语句
用于跳过当前循环体的剩余部分,并直接进入下一次迭代。
void main() {
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
print(i);
}
}
输出: 1, 3, 5, 7, 9
四、标签(Labels)
用于标记循环或 switch 语句,以便在嵌套结构中精确控制跳转。
- 使用
break或continue结合标签:
void main() {
outerLoop:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outerLoop; // 退出外层循环
}
print('i: $i, j: $j');
}
}
}
输出:
i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0
五、条件控制最佳实践
5.1、避免嵌套过深
过多的嵌套会使代码难以阅读和维护。尽量保持条件语句的层次扁平化。
// 不推荐
if (condition1) {
if (condition2) {
// ...
}
}
// 推荐
if (condition1 && condition2) {
// ...
}
5.2、使用守卫语句
提前返回或继续循环可以帮助减少不必要的嵌套。
void processUser(User user) {
if (user == null) return; // 守卫语句
// 继续处理用户逻辑
}
5.3、使用集合方法简化逻辑
Dart提供了许多集合方法,如 where、any 和 every,可以简化复杂的条件判断。
List<int> numbers = [1, 2, 3, 4, 5];
bool hasEven = numbers.any((num) => num % 2 == 0);
print(hasEven); // 输出: true
5.4、尽量使用switch代替长链的if-else
当有多个离散值需要匹配时,switch 语句通常比长链的 if-else 更清晰和高效。
// 不推荐
if (command == "OPEN") {
// ...
} else if (command == "CLOSE") {
// ...
} else {
// ...
}
// 推荐
switch (command) {
case "OPEN":
// ...
break;
case "CLOSE":
// ...
break;
default:
// ...
}
六、循环控制最佳实践
6.1、避免无限循环
确保循环条件最终会变为 false,以避免无限循环导致程序卡死或崩溃。
6.2、使用集合方法简化逻辑
Dart 提供了许多集合方法,如 forEach、map 和 where,可以简化复杂的迭代逻辑。
List<int> numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) {
print(number); // 输出: 1, 2, 3, 4, 5
});
6.3、尽量使用增强型 for-in 循环
对于遍历集合,尽量使用增强型 for-in 循环,使代码更加简洁易读。
List<int> numbers = [1, 2, 3, 4, 5];
for (var number in numbers) {
print(number); // 输出: 1, 2, 3, 4, 5
}
6.4、合理使用标签
标签可以在复杂的嵌套结构中提供更精确的控制,但在简单情况下应尽量避免使用,以免增加不必要的复杂性。
七、总结
为什么流程控制如此重要?
- 灵活性:通过条件语句,程序可以根据不同的情况执行不同的代码块,使应用更加灵活。
- 自动化:循环语句允许代码自动重复执行,简化了处理大量数据或任务的过程。
- 精确控制:跳转语句如
break和continue提供了对执行流程的精细控制,确保程序按照预期运行。 - 提高可维护性:良好的流程控制结构让代码更易于理解和维护,减少了错误的发生。
- 优化性能:通过合理的流程控制,可以避免不必要的计算,优化程序性能。
通过掌握 if-else、switch 语句进行条件判断,利用 for、while 和 do-while 实现循环迭代,以及运用 break、continue 和 return 进行精确的跳转控制,开发者可以构建灵活、高效且易于维护的应用程序。此外,标签(Labels)和增强型 for-in 循环等高级特性进一步提升了代码的简洁性和可读性。理解并熟练应用这些流程控制机制,是编写高质量代码的关键。
码字不易,记得 关注 + 点赞 + 收藏 + 评论