欢迎光临散文网 会员登陆 & 注册

第 17 讲:程序结构(三):跳转结构

2021-04-01 09:12 作者:SunnieShine  | 我要投稿

Part 1 我们来试试写一个质数计算程序

C 语言里我们基本上是必学的算法:计算质数。那么算法我们就不啰嗦了,我们来看一下代码:

Math.Sqrt 方法是求一个数字的平方根的。如果需要使用这个方法,和 Console.WriteLine 一样,我们依旧需要使用 using System; 这条引用指令。

我们推广一下,我们如果要找第一个大于 50 的合数的话,我们可以这么写:

可以从代码里看出,我们 for 里嵌套了一个 for。初学的话,你可以把内层循环当成“个位数”,而外层循环当成“十位数”。在数值不断增大的过程中,个位数要变化 10 次(0 到 9)之后,十位数才会进一位。双层循环是一样的道理:内层循环在外层循环变化一次的时候,反复执行。直到内层循环完整执行完毕后,外层循环才会继续更新一次。

当内层循环完成后,下方的 if 条件必然会被遇到。此时就看 isPrime 变量此时是不是 true。如果是,则会执行 break,跳出循环。

稍微注意一下的地方是,内层循环里也有一个 break 语句。这个 break 语句只跟内层循环有关系:跳出循环也只到第 14 行,而不是直接两层循环都跳出。

显然。这种写法有一个无关痛痒的问题:这个 if (!isPrime) 单独写出来,逻辑看起来有点臃肿。因此,goto 语句诞生了。

Part 2 goto 语句和标签

我们先来说一下标签(Label)的概念。标签就是用来控制自定义跳转的机制。我们把标签放在一个位置,相当于传送门的终点;而 goto 语句相当于传送门的起点。代码在执行的时候一旦遇到这句话,就自动跳转到终点。

你可以试着运行一下程序。这个例子里的 OutputResult 就是一个标签。标签使用 内容: 的格式表示。在内部找到合数的时候,就自动跳转到输出结果的地方,这样就非常方便。

Part 3 用标签模拟循环

标签的灵活程度可以完整包含 breakcontinue 这些语句的执行。循环也是不在话下。如果我们禁用循环,我们可以使用标签来模拟循环。

比如这么写代码。

Part 4 goto-case 语句

switch 语句里,我们使用 case 来控制数值的可能性。在 C# 里,我们有一种跳转模式,使用 goto 语句来跳转执行到指定的标签内容上的内容。

考虑一个例子。我们现在输入一个 1 到 12 的一个月份数值,然后求的是从 1 月份到现在这个输入的月份,期间一共多少天。为了简化问题计算,我们只考虑整月:比如我输入 3,那么程序就计算 1、2、3 月份一共多少天。

这个例子里,我们为了解决统计数据,我们可以倒着“加”。

我们考虑这个写法,goto case 数值 表示在这个部分执行完成后,自动跳转到指定情况的条件上去执行。举个例子,我们输入的 month 是 3,那么 switch 语句会自动跳转到 case 3 开始执行。此时 day += 31 执行完成,然后执行 goto case 2 语句。此时,程序并不会自动跳出 switch(按道理默认是自动跳出去),但是 goto case 语句可以控制代码跳转到 case 2 处继续执行 day += 28 的内容。这种写法就串联起来后面的逻辑了。

这种写法非常神奇,请注意这种写法格式。

顺带一提,我们也可以用 goto default 来指定跳转到 default 情况上去。





第 17 讲:程序结构(三):跳转结构的评论 (共 条)

分享到微博请遵守国家法律