C# 跳转语句全面演练第 1 部分 - break、continue
介绍
当你开始学习一门编程语言,比如 C# 时,最重要的概念之一就是流程控制。我们知道一个程序是由语句组成的。这些语句的组合方式使得程序更加强大。这就是流程控制的职责:控制程序执行的流程。
在许多情况下,逐个顺序执行是不够的,因此流程控制提供了很多有用的语句,如条件语句、迭代语句、跳转语句和其他高级功能。在本指南中,我们将重点介绍 C# 中的一个重要流程控制:跳转语句。
跳转语句在复杂逻辑中起着重要作用。它甚至可以讲述著名的寓言《乌鸦和水罐》:
一只口渴的乌鸦想喝水罐里的水,但它够不到水。所以它不得不捡起鹅卵石,一次又一次地把它们扔进水罐里,直到水够到为止。
作为初学者的教程,我尽力使用生动的可视化和示例来帮助您理解。
- 首先,我将从一个有趣的场景开始。
- 接下来我会把各类跳转语句的代码模板和流程图展示给大家。
- 此外,我们对其进行了比较,并总结了最佳实践。
- 最后我们来谈谈高级用法。
本指南(第 1 部分)将重点介绍基本概念并介绍两个重要的跳转语句:break和continue语句。
入门
有些读者可能会好奇。什么是跳转语句?为什么我们需要它?
让我们回到“乌鸦和水罐”这个寓言故事。
定义一堆鹅卵石为int数组,假设投手的剩余空间为pitcherVacancy 。乌鸦需要不断捡起鹅卵石来填满pitcherVacancy 。所以循环在这里是合适的。但是一旦投手满了,我们就应该跳出循环。Jump语句就是为这种情况而生的。
我们先看一下实现:
Console.WriteLine("pick up pebbles to fill the vacancy in pitcher");
int pitcherVacancy = 28;
int[] pebbles = {8, 6, 7, 9, 8, 5, 10};
foreach (int pebble in pebbles) // use foreach to pick up all the pebbles
{
pitcherVacancy -= pebble;
Console.WriteLine("pick up a pebble size of {0}, get {1} vacancy left", pebble, pitcherVacancy);
if (pitcherVacancy <= 0) // break out once pitcher is full
{
break;
}
Console.WriteLine("still can not reach the water, I have to pick up more pebbles");
}
Console.WriteLine("finally, I can drink the water!");
让我们运行寓言程序:
pick up pebbles to fill the vacancy in the pitcher
pick up a pebble size of 8, get 20 vacancies left
still can not reach the water, I have to pick up more pebbles
pick up a pebble size of 6, get 14 vacancies left
still can not reach the water, I have to pick up more pebbles
pick up a pebble size of 7, get 7 vacancies left
still can not reach the water, I have to pick up more pebbles
pick up a pebble size of 9, get -2 vacancies left
finally, I can drink the water!
从上面的例子,我们可以看到是否我们要改变循环中的流程,比如在某些条件下中断循环,或者跳过其余循环逻辑并继续进行下一次迭代,甚至转到任何你想要的地方。
这就是跳转语句在控制流中的作用。我们将在后面的章节中学习这三个基本的跳转语句。
break 语句
句法
由于我们在上一节中已经学习了break语句的示例,现在是时候学习 C# 中break的语法了。以下是代码模板:
loop (loop_condition) // represents all kinds of loop
{
code_block_before_break;
if (break_condition)
{
break;
}
code_block_after_break;
}
分析break语句中的各个部分:
- loop代表所有类型的迭代语句,包括do-while,尽管语法略有不同。
- break_condition是一个布尔表达式,决定中断循环的条件。
- code_block_before_break是break之前的逻辑。
- code_block_after_break是break之后的逻辑,当break触发时,会跳过该逻辑。
流程图
我画了一个break语句的流程图来帮助你更好的理解流程控制。
红线代表循环流程,蓝线代表跳转流程。或者你也可以只关注代码模板中的箭头方向。
从流程图中我们可以看到break是在标准循环上构建的,关键是当break_condition被触发时,跳过剩余的循环。
continue 语句
设想
想象一下这样的场景:
设计一个彩票生成器,生成1到9六个数字,且不允许有重复的数字。
continue语句可以解决这个问题。
句法
按照惯例,我们首先学习continue语句的语法。
loop (loop_condition)
{
code_block_before_continue;
if (continue_condition)
{
continue;
}
code_block_after_continue;
}
continue中的代码段与break类似,如有需要可参考上一节。
流程图
请看一下继续流程图。它直观地显示了流程控制。
红线代表循环流程,蓝线代表继续跳转流程。或者你也可以只关注代码模板中的箭头方向。
与break类似,我们可以看到continue也是建立在标准循环之上。唯一的区别是,当continue_condition触发时,会跳过当前迭代中的其余循环逻辑。
实践
既然我们已经了解了continue的机制,现在是时候解决彩票问题了。这个想法是在循环中生成数字,直到我们得到足够的数字。如果某个数字是重复的,我们就放弃它并继续循环。
Random random = new Random();
List<int> lottery = new List<int>();
while (lottery.Count < 6)
{
int num = random.Next(1, 10);
if (lottery.Contains(num))
{
Console.WriteLine("{0} already exists, generate again", num);
continue; //if num is duplicate, abandon and generate again
}
lottery.Add(num);
Console.WriteLine("generate number: {0}", num);
}
Console.WriteLine("the result of lottery is: {0}", string.Join(", ", lottery));
生成结果如下:
generate number: 1
generate number: 9
9 already exists, generate again
generate number: 2
generate number: 8
generate number: 4
2 already exists, generate again
generate number: 7
the result of the lottery is: 1, 9, 2, 8, 4, 7
请注意,这个解决方案不是最有效的算法,但却是continue的一个很好的例子。
用于嵌套循环
<font sty
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~