从零开始的嵌入式生活:break、continue、goto详解

一、break关键字

break适用于switch-case语句,也适用于while、for,当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。

但是注意:在多层循环中,一个 break 语句只向外跳一层。例如,输出一个4*4的整数矩阵:

#include <stdio.h>

int main(void)
{
    int i = 1, j = 1;
    while(1)  //外层循环
    {
        j = 1;
        while(1)  //内层循环
        {
            printf("%-4d", i*j);
            j++;
            if(j > 4)
            {
                break;  //跳出内层循环
            }
        }
        printf("\n");
        i++;
        if(i > 4)
        {
            break; //跳出外层循环
        }
    }
    return 0;
}

运行结果:

1   2   3   4
2   4   6   8
3   6   9   12
4   8   12  16

当 j>4 成立时,执行break;,跳出内层循环;外层循环依然执行,直到 i>4 成立,跳出外层循环。内层循环共执行了4次,外层循环共执行了1次。

break语句是跳出while、for,但是不能跳过它对应的for while以后的语句。

二、continue语句

continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。

来看一个例子:

#include <stdio.h>

int main(void)
{
    char c = '\0';

    while( c != '\n')
    {
        c = getchar();  //在缓冲区获取一个字符

        if(c == '4' || c == '5') 
        {   
            continue;
        } 

        printf("%c ", c);

    }

    return 0;
}

结果:

0123456789
0 1 2 3 6 7 8 9

程序遇到while时,变量c的值为'\0',循环条件c!='\n'成立,开始第一次循环。getchar() 使程序暂停执行,等待用户输入,直到用户按下回车键才开始读取字符。

本例我们输入的是 0123456789,当读取到4或5时,if 的条件c=='4'||c=='5'成立,就执行 continue 语句,并跳过后面的代码,也就是不执行后面代码,直接进入下一次循环,也就是说 printf("%c ", c);不会被执行到。而读取到其他数字时,if 的条件不成立,continue 语句不会被执行到, printf("%c ", c);;就会输出读取到的字符。

break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来跳出本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

三、goto语句

goto语句也称为无条件转移语句,其一般格式如:goto 语句标号; 其中语句标号是按标识符规定书写的符号(类似写变量一样), 放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与 goto 语句配合使用。

goto语句也称为无条件转移语句,其一般格式如下:

语句标号:
    
    //语句

goto 语句标号;

或者

goto 语句标号;

语句标号:

其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与goto句配合使用。如:

#include <stdio.h>

int main(void)
{
    int i;

    //goto组成的语句相当于while(1)
loop:

    printf("请输入变量i的值:");
    scanf("%d", &i);
    printf("你输入i的值:%d\n", i);

    goto loop;

    return 0;
}

运行结果:

请输入变量i的值:54
你输入i的值:54
请输入变量i的值:14
你输入i的值:14
请输入变量i的值:25
你输入i的值:25

C语言不限制程序中使用标号的次数,但各标号不得重名。goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句。

goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

关于 goto 使用语句的一些建议

goto 语句在结构化编程技术出来后,被当作破坏结构化程序的典型代表,可以说,在结构化程序设计年代,goto 语句就像洪水猛兽一样,程序员都唯恐避之不及;可后来在微软的一些例子程序中经常把 goto 语句用来处理出错,当出错时,goto 到函数要退出的一个label那里进行资源释放等操作。goto 语句也不是只可以用于出错处理,其它地方都不可以用了。下列关于使用 goto 语句的原则可以供读者参考。

  1. 使用 goto 语句只能 goto 到同一函数内,而不能从一个函数里goto到另外一个函数里。
  2. 使用 goto 语句在同一函数内进行 goto 时,goto 的起点应是函数内一段小功能的结束处,goto 的目的label处应是函数内另外一段小功能的开始处。
  3. 应该避免向两个方向跳转。这样最容易导致"面条代码"。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值