3.3 跳转语句的应用
跳转语句主要用于无条件地转移控制到某个位置,这个位置就称为跳转语句的目标。跳转语句主要包括break语句、continue语句、return语句和goto语句4种。下面将对这几种跳转语句做简单的介绍。
3.3.1 break跳转语句
在之前讲解的switch语句中用到了break语句,break break语句不仅可以使用在此,还可以把它用于for、while、do…while以及foreach循环语句中。break语句使程序跳出当前循环,并继续执行循环之后的代码。当break出现在嵌套循环语句中时,break语句只能出现在最里层的语句中。如果要穿越多个嵌套语句,则必须使用goto语句。
下面通过一个小例子来讲解下break语句的用法。
例3-6:break语句的使用(ConsoleBreak)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleBreak { class Program { static void Main(string[] args) { int num = 0; string[] strs = new string[] { "LiLei", "HanMeimei", "LinTao", "Kate", "Uncle Wang", "Jim", "Tom", "Lily", "Lucy", "Ann", "polly" }; foreach (string s in strs) { num++; if (s == "Tom") { Console.WriteLine("找到Tom了,他在编号" + num + "的位置!"); break; } Console.WriteLine("位置" + num + "处没有Tom"); } Console.ReadLine(); } } }
运行结果如图3-14所示。
图3-14 break语句的使用
此例使用foreach语句遍历数组,查找“Tom”所在的位置,找到后使用break语句结束循环。
3.3.2 continue跳转语句
continue语句与break语句类似,必须出现在for、while、do…while和foreach循环语句中,continue语句的作用是退出当前循环结构的本次循环,并开始执行下一次循环,而不是退出当前循环结构。当嵌套循环语句存在时,continue语句只能使直接包含它的循环语句开始一次新的循环。
下面通过一个小例子来讲解下continue语句的用法。
例3-7:continue语句的使用(ConsoleContinue)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleContinue { class Program { static void Main(string[] args) { for (int i = 1; i <= 10; i++) { if (i % 2 != 0) continue; Console.WriteLine(i); } Console.ReadLine(); } } }
运行结果如图3-15所示。
图3-15 continue语句的使用
此例使用for循环语句,对循环变量i取余,如果余数不为0,则continue语句就终止当前循环,继续下一次循环,所以只输出2、4、6、8、10。
3.3.3 return跳转语句
return语句终止它出现在其中的方法的执行并将控制返回给调用方法。它还可以返回一个可选值。如果方法为void类型,则可以省略return语句。
如果return语句位于try块中,则将在控制流返回到调用方法之前执行finally块(如果存在)。
下面通过一个小例子来讲解下return语句的用法。
例3-8:return语句的使用(ConsoleReturn)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleReturn { class Program { static void Main(string[] args) { while (true) { string num1, num2, choose; Console.WriteLine("请输入一个数字(输入“e”退出程序)"); num1 = Console.ReadLine(); if (num1 == "e") { break; } Console.WriteLine("请输入另一个数字"); num2 = Console.ReadLine(); Console.WriteLine("请选择要进行的运算:"); Console.WriteLine("1.+\t2.-\t3.*\t4./"); choose = Console.ReadLine(); Console.WriteLine("计算结果为:{0}", Operational(Convert. ToDouble(num1), Convert.ToDouble(num2), choose)); Console.WriteLine("——————————————"); } Console.WriteLine("您已经成功退出,再见!"); Console.ReadLine(); } public static string Operational(double num1, double num2, string choose) { switch (choose) { case "1": return (num1 + num2).ToString(); case "2": return (num1 - num2).ToString(); case "3": return (num1 * num2).ToString(); case "4": return (num1 / num2).ToString(); default: return "输入有误!"; } } } }
运行结果如图3-16所示。
图3-16 return语句的使用
此实例实现了一个简易的加减乘除计算器的效果,代码中根据输入的choose值判断做何种运算,switch语句的每个case中使用return语句直接将转为string类型后的计算结果返回了函数调用处,这又引出了case中的一种特殊情况——当一个case中需要return语句时,break语句要省略,因为两者共存没有任何意义(位于后面的一个语句将永远无法被程序执行到)。关于函数的相关知识将在后续章节进行讲解,此处不做具体讲解。注意此实例未进行异常处理,旨在讲解return的用法。
3.3.4 goto语句
goto语句用于将控制转移到事先定义的标签标记的语句。goto语句可以应用于switch语句中的case标签和default标签以及事先定义的标记语句所声明的标签。goto语句的三种形式及介绍如下。
goto case表达式:
goto case语句的目标为它所在switch语句中的某个语句列表。
goto default:
goto default语句的目标是它所在的switch语句的default标签。
goto 【标签】:
goto【标签】语句的目标是具有给定标签的标记语句。此用法可用于跳出多层嵌套循环语句。但是,不能使用goto语句从外部进入循环。
下面通过一个小例子来讲解下goto语句的用法。
例3-9:goto语句的使用(ConsoleGoto)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleGoto { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("请输入任意字符,(输入"e"退出)"); string str = Console.ReadLine(); if (str == "e") goto exit; Console.WriteLine("您输入了" + str); } exit: Console.WriteLine("您已经成功退出循环!"); Console.ReadLine(); } } }
运行结果如图3-17所示。
图3-17 goto语句的使用
此实例演示了goto【标签】的用法,当输出“e”时,程序直接跳出了while循环,并在定义为exit的标签处继续执行程序。
goto在使用时存在一些争议,有人建议避免使用它,因为它会打乱程序代码的执行顺序,使程序代码的可维护性较差,所以应尽量避免使用goto语句。
3.3.5 各跳转语句的区别
(1)break语句:跳出(终止)循环。
(2)continue语句:跳出(终止)当前的循环,继续执行下一次循环。
(3)return语句:跳出循环以及其包含的函数。
(4)goto语句:可以跳出循环到已标记好的位置上。