break、continue、goto


break可以离开目前switchforwhiledo while的区块,并前进至区块后下一个语句,在switch中主要用来结束语句进行至下一个case的比对,在forwhiledo while中,主要用于中断目前的循环执行,如果break出现并不是内含在forwhile循环中或switch陈述中,则会发生编译错误,break的例子我们之前看过不少,这边不再举例。

continue的作用与break类似,主要使用于循环,所不同的是break会结束区块的执行,而continue只会结束接下来区块中的语句,并 跳回循环区块的开头继续下一个循环,而不是离开循环,例如:

for(int i = 1; i < 10; i++) {
    if(i == 5) {
        break;
    }

    printf("i = %d\n", i);
}

这段程序会显示i = 14,因为当i等于 5 时就会执行break而离开循环。

再看下面这个程序:

for(inr i = 1; i < 10; i++) {

if(i == 5) {
    continue;
}

printf("i = %d\n", i);

}

这段程序会显示 1 到 4,与 6 到 9,当i等于5时,会执行continue直接结束此次循环,这次循环printf()该行并没有被执行,然后从区块开头头执行下一次循环,所以 5 并没有被显示。

goto是一个很方便,但是最不被建议使用的语法,滥用它的话会破坏程序的架构、使得程序的逻辑难以理解,事实上,在完全不使用goto的情况下, 也可以使用结构化的语法来编写程序。

goto可以在程序中任意跳跃,跳跃前必须先设定好目的地,跳跃时必须指定目的地,例如:

START: 
.... 
.... 
goto START;

其中START就是goto目的地的一个标签(Label),后面使用冒号,标签可以出现在程序的任一个地方。

一个简单的例子是这样的:

#include <stdio.h>

int main(void) {
    int input = 0;

BEGIN:
    printf("输入一数:");
    scanf("%d", &input);
    if(input == 0) {
        goto ERROR;
    }

    printf("100 / %d = %f\n", input, (double) 100 / input);

    return 0;

ERROR:
    puts("除数不可为 0");
    goto BEGIN;
}

执行结果:

输入一数:0
除数不可为 0
输入一数:10
100 / 10 = 10

如果输入 0,则程序会跳至ERROR标签然后显示错误消息,并重新跳至BEGIN标签,然后再执行一次提示与输入,想想看就知道了,多跳个几次之后,这个程序的逻辑马上会让你变得混乱不堪。

这个程序还是这么写好一些:

#include <stdio.h>

int main(void) {
    int input = 0;

    while(!input) {
        printf("输入一数:");
        scanf("%d", &input);

        if(input != 0) {
            printf("100 / %d = %f\n", input, (double) 100 / input);
        } else {
            puts("除数不可为 0");
        }
    }

    return 0;
}

就结论而言,goto并非不可使用,只是初学者在还没有足够的经验下,往往容易滥用,初学者最好暂时先忘了goto的存在,待足够的经验之后,才有能力判断真正要使用goto的时机。


展开阅读全文