
3.5 跳转语句
跳转语句用于中断当前执行顺序,从指定语句接着执行。在switch语句中曾使用跳转语句中的break语句,中断了当前的switch语句块,执行switch后的语句。
跳转语句同样分为多种,其关键字及其使用特点如下所示。
□ break语句 break语句用于终止它所在的循环或switch语句。
□ continue语句 continue语句将控制流传递给下一个循环。
□ return语句 return语句终止它出现在其中的方法的执行,并将控制返回给调用方法。
□ goto语句 goto语句将程序控制流传递给标记语句。
3.5.1 break语句
3.2.4节曾将break语句用于switch语句块,对break语句有了简单了解。break有两种用法:
□ 用在switch语句的case标签之后,结束switch语句块,执行switch{}后的语句。
□ 用在循环体,结束循环,执行循环{}后的语句。
循环有多种,任意一种循环都可以使用break跳出。接下来通过实例讲述break语句与循环语句的结合。
【练习3-14】
851在100以内有两个约数,23和37。找出100以内,851除了1以外的最小约数,语句如下:
int num=0; for (int i = 2; i < 101; i++) { if (851 % i == 0) { num = i; break; } } Console.Write(num);
运行结果为:23。说明循环在i=23时就结束了,否则i应该为37。break语句直接跳出了for循环而不是if选择语句,也说明if选择语句中不需要使用break跳转。
3.5.2 continue语句
continue语句是跳转语句的一种,用在循环中可以加速循环,但不能结束循环。continue语句与break不同之处在于:
□ continue语句不能用于选择语句。
□ continue语句在循环中不是跳出循环块,而是结束当前循环,进入下一个循环,忽略当前循环的剩余语句。
同样是找出约数,将练习3-14改为找出100以内除了1以外的所有约数,如练习3-15所示。
【练习3-15】
找出100以内,除了1以外,851的所有约数,语句如下。
for (int i = 2; i < 101; i++) { if (851% i == 0) { num = i; Console.WriteLine(num); continue; } }
执行结果为:
23 37
练习3-15的例子中省略continue效果是一样的,因为循环语句中continue语句后没有语句,因此有没有continue都将执行下一个循环。continue语句的使用效果如练习3-16所示。
【练习3-16】
输出整型数1至30,但取消整数5的倍数的输出,在执行到5的倍数时换行。使用语句如下所示:
for (int i = 1; i < 30; i++) { if (i % 5==0) { Console.Write("\n"); continue; } if (i < 10) { Console.Write(" {0} ", i); } else { Console.Write(i); Console.Write(" "); } }
执行结果如图3-22所示。从执行结果看得出,在执行至continue语句后,“Console.Write(" {0} ", i);”语句和“Console.Write(i);”语句都没有执行,数字5没有输出,而输出了换行。

图3-22 30以内的数字显示
3.5.3 return语句
return语句经常用在方法的结尾,表示方法的终止。方法是类的成员,将在第5章中介绍。
方法相当于其他编程语言中的函数,是描述某一功能的语句块。方法定义后并不是直接执行的,而是在其他地方使用语句调用的,如同变量在声明后在其他地方被调用。
方法可以有返回值,在调用时将返回值传递给调用语句,也可以没有返回值。返回值可以是常数,也可以是变量,由return语句定义返回值。
方法语句块中,在return语句后没有其他语句,但控制流并没有结束,而是找不到接下来要进行的语句。使用return语句将控制流传递给调用该方法的语句,同时将返回值传递给调用语句。
方法的定义需要有访问修饰符、返回数据类型、方法名称和参数列表,以及方法中的语句块。参数是方法中的变量,这些变量由调用它的语句来赋值,作为已经被初始化的数据来使用。
如定义一个方法power()将整型数字num求pow次方,该方法含有两个参数,一个是整型数字num,另一个是该数需要获取的乘方数pow,方法返回两个数的计算结果,代码如下:
public static int power(int num, int pow) { int newnum=1; for (int i = 1; i <= pow; i++) { newnum = newnum * num; } return newnum; }
上述代码中,通过for循环将变量num乘了pow次,并将结果赋给newnum。最后一条语句使用return关键字返回运算结果newnum。
方法的调用需要指定方法中的参数,如调用该方法,计算12的10次方,则调用语句如下所示:
power(12,10);
如在Main()函数中调用该方法,输出12的10次方计算结果,使用语句如下所示:
Console.WriteLine("数字12的10次方为{0}",power(12,10));
运行上述代码,其结果如下所示。
数字12的10次方为61917364224
3.5.4 goto语句
goto语句是跳转语句中最灵活的,也是最不安全的。goto语句可以跳转至程序的任意位置,但欠考虑的跳转将导致没有预测的漏洞。goto语句也有限制:
□ 可以从循环中跳出,但不能跳转到循环语句块中。
□ 不能跳出类的范围。
使用goto语句首先要在程序中定义标签,标签是一个标记符,命名同变量名一样。标签后是将要跳转的目标语句,一条以内不用加{},超过一条则必须放在{}内,{}后不用加分号。如下所示:
label:{}
接着将标签名放在goto语句后,即可跳转至目标语句,如下所示:
goto label;
练习3-17简单地显示了goto语句的用法和格式,将控制流从循环中跳出。
【练习3-17】
输出从1到10的整数,在输出整数5时跳出,从整数5往后不再输出,使用语句如下。
for (int i = 1; i < 11; i++) { Console.WriteLine(i); if (i == 5) { Console.Write("\n"); goto comehere; } } comehere: { Console.WriteLine("到5了,结束了"); }
除了跳出循环语句,goto语句另外一种用法是跳出switch语句并转移到另一个case标签,如练习3-18。
【练习3-18】
定义整型num表示第几个季节,定义字符串title表示季节名称,有如下的代码:
int num = 4; string title=""; switch (num) { case 1: title = "春天"; break; case 2: title = "夏天"; break; case 3: title = "秋天"; break; case 4: title = "冬天"; goto case 2; } Console.WriteLine(title);
执行结果为:
夏天
由结果看出,因为num变量使用的是常数4,所以控制流将执行case 4,但在case 4中使用goto语句将控制流转向了case 2,导致显示结果为case 2中的夏天。case在这里起到了标签的作用。