第 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
情况上去。