C#实践教程(第2版)
上QQ阅读APP看书,第一时间看更新

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在这里起到了标签的作用。