第 17 讲:程序结构(三):跳转结构
C 语言里我们基本上是必学的算法:计算质数。那么算法我们就不啰嗦了,我们来看一下代码:
Math.Sqrt方法是求一个数字的平方根的。如果需要使用这个方法,和Console.WriteLine一样,我们依旧需要使用 这条引用指令。
我们推广一下,我们如果要找第一个大于 50 的合数的话,我们可以这么写:
可以从代码里看出,我们 for 里嵌套了一个 for
当内层循环完成后,下方的 if 条件必然会被遇到。此时就看 isPrime 变量此时是不是 true。如果是,则会执行 break,跳出循环。
稍微注意一下的地方是,内层循环里也有一个
break语句。这个break语句只跟内层循环有关系:跳出循环也只到第 14 行,而不是直接两层循环都跳出。
显然。这种写法有一个无关痛痒的问题:这个 if (!isPrime) 单独写出来,逻辑看起来有点臃肿。因此,goto 语句诞生了。
Part 2 goto 语句和标签
我们先来说一下标签(Label)的概念。标签就是用来控制自定义跳转的机制。我们把标签放在一个位置,相当于传送门的终点;而 goto 语句相当于传送门的起点。代码在执行的时候一旦遇到这句话,就自动跳转到终点。
你可以试着运行一下程序。这个例子里的 OutputResult 就是一个标签。标签使用 内容:
Part 3 用标签模拟循环
标签的灵活程度可以完整包含 break、continue 这些语句的执行。循环也是不在话下。如果我们禁用循环,我们可以使用标签来模拟循环。
比如这么写代码。
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情况上去。

