zoukankan      html  css  js  c++  java
  • C语言 goto,break和continue跳转语句详解!

    控制程序流程跳转的通常有 goto、break、continue 等语句。

    一、goto语句

    goto 语句是一种无条件流程跳转语句,通常 goto 语句与 if 语句结合使用,当满足一定条件时,程序流程跳转到指定标号处,接着往下执行。

    定义语句标识的格式如下:

    语句标识:语句;

    其中,“语句标识”可以是任一个合法的标识符,如 pos_1、pos_2、label_1、label_2 等都是合法的语句标识。注意,语句标识后的冒号不能省略。

    goto 语句的调用语法格式为:

    goto 语句标号;

    程序将从对应“语句标号”的代码处开始往下执行。

    【例 1】分析以下程序,了解 goto 语句的使用。

    #include<stdio.h>
    
    int main (void){
    
        int n;
    
        pos_1:
    
            printf("请输入一个正整数:");
    
            scanf("%d",&n);
    
            if(n<0)
    
            {
    
                printf("输入错误!
    ");
    
                goto pos_1;
    
            }
    
            printf("成功输入正整数:%d
    ",n);
    
            return 0;
    
    }

    代码分析:

    在上述程序代码中,有一个语句标号 pos_1。该程序的执行流程如下:

        ▶ pos_1 标号处。先提示用户“请输入一个正整数:”。

        ▶ 如果用户输入的是正整数,则提示“成功输入正整数:***”。执行第 4 步。

        ▶ 如果用户输入的是负数,则进入循环体,提示“输人错误!”。程序执行流程跳转到 pos_1 处,即跳转到第 1 步,继续往下执行。

        ▶ 程序结束。

    程序运行结果:

    假设某次运行,依次输入 -2、-6、3 等数字,其运行结果如下:

    请输人一个正整数:-2

    输入错误!

    请输入一个正整数:-6

    输入错误!

    请输入一个正整数:3

    成功输入正整数:3

    =====================

    通过上述执行流程及运行结果的分析,可以发现该例中使用 goto 跳转语句实现了循环的功能。故可以使用循环结构的代码替换该 goto 结构的代码。

    等价实现代码:

    #include<stdio.h>
    
    int main (void)
    
    {
    
        int n;
    
        printf ("请输入一个正整数:");
    
        scanf("%d",&n);
    
        while(n<0)
    
        {
    
            printf ("输入错误!
    ");
    
            printf ("请输入一个正整数:");
    
            scanf("%d",&n);
    
        }
    
        printf ("成功输入正整数:%d
    ",n);
    
        return 0;
    
    }

    使用 goto 语句可能会造成程序层次不清晰,可读性差,故在实际编程中,应尽量少使用或避免使用 goto 语句。

    二、break语句

    当执行到循环体中的 break 语句时,将终止 break 所在该层的循环,从该层循环体之后的语句开始继续执行。

    break 的执行流程如下所示:

    单重循环情况:

    选用 while 循环结构示意,do-while 循环、for 循环同样适用。

    while (循环判断表达式)

    {

        ...

        if(条件表达式)

            break;

        循环体中break后的语句;

    }

    循环体后的第 1 条语句;

    循环体后的第 2 条语句;

    ...

    在循环体中,当满足一定条件执行到 break 语句时,终止 break 所在的该层循环,即“循环体中 break 后的语句”部分将不再被执行,程序执行流程转向从“循环结构后的第 1 条语句”处,开始继续往后执行。

    双重循环情况:

    使用双重 for 循环嵌套结构示意,其他类型的循环嵌套组合同样适用。

    for (;循环判断表达式1;)
    
    {
    
        ...
    
        for(;循环判断表达式2;)
    
        {
    
            ...
    
            if(条件表达式)
    
                break;
    
            内层循环体中break后的语句;
    
        }
    
        内层循环结构后的第1条语句; 内层循环结构后的第2条语句;
    
        ...
    
    }

    在内层循环中,当满足一定条件执行到 break 语句时,仅结束 break 所在内层循环的执行(在本轮外层循环中,“内层循环体中 break 后的语句”部分不再被执行),程序执行流程跳转到“内层循环结构后的第 1 条语句”所在的外层循环体处,开始继续执行。

    ========================

    【例 2】分析以下程序输出结果,掌握 break 语句的使用方法。

    #include<stdio.h>
    
    int main (void)
    
    {
    
        int s=0,i;
    
        for(i=1;i<=10;i++)
    
        {
    
            if (6==i)
    
                break;
    
            s+=i;
    
        }
    
        printf("sum=%d
    ", s);
    
        return 0;
    
    }

    当 i< 6时,均不执行 break 语句,可以将其忽略。即 i<6 时,等价于如下代码。

    for(i=1;i<=10;i++)
    
    {
    
        s+=i;
    
    }

    相当于执行了加法运算 s=1+2+3+4+5=15。

    当 i=6 时,执行 break 语句,立即终止 break 语句所在的该层 for 循环,故 i=6 并没有累加到 s 上,接着从 for 循环结构后的第一条语句 printf("sum=%d ",s); 处开始继续执行。

    程序运行结果为:

    sum=15

    三、continue语句

    在循环体中设置 continue 语句,同样可以改变循环的执行流程,只不过它不像 break 那样结束整个循环体,而是仅结束本次循环体的执行,提前进入下一次循环。

    continue 语句的执行流程如下所示(选用 for 循环结构示意):

    for(初始表达式;循环判断表达式;增量表达式)
    
    {
    
      ...
    
      if(条件表达式)
    
          continue;
    
        循环体中continue后的所有语句;
    
    }

    当在上述 for 循环中执行到 continue 语句时,本次循环体的执行流程将跳过“循环体中 continue 后的所有语句”,接着执行“增量表达式”部分,然后执行“循环判断表达式”,即提前进入下一次循环的准备工作。

    【例 3】分析以下程序输出结果,掌握 continue 语句的使用方法。

    #include<stdio.h>
    
    int main (void)
    
    {
    
        int s=0,i;
    
        for(i=1;i<=10;i++)
    
        {
    
            if(6==i)
    
                continue;
    
            s+=i;
    
        }
    
        printf("sum=%d
    ",s);
    
        return 0;
    
    }

    程序分析:

    1) 当 i≠6 时,也就是 i≤5 时,忽略 continue 语句,相当于:

    for(i=1;i<=10; i++)
    
    {
    
        s+=i;
    
    }

    即:s=1+2+3+4+5

    2) 当 i=6 时,执行 continue 语句,本次循环(i=6)体中 continue 后的语句 s+=i; 将被忽略,接着执行增量表达式 i++,相当于 i=6 没有累加到 s 上。

    3) 后续的循环中 i 不再可能等于 6,故 continue 语句也将被忽略。故程序功能相当于把 1〜10 中除 6 之外的 9 个数累加到 s 上。即 s=1+2+3+4+5+7+8+9+10=49。

    运行结果为:

    sum=49 


     

    如果你还想更深入的学习以及其他知识,不管你是转行也好,初学也罢,进阶也可~

    【值得关注】我的 编程学习交流俱乐部 !【点击进入】

    C语言入门资料:


     

    C语言必读书籍:


     
  • 相关阅读:
    AngularJS ng-show 指令
    JavaScript 表单
    input type=”datetime”-local (Elements) – HTML 中文开发手册
    CSS3 overflow-y 属性
    ASP CodePage 属性
    Spring Boot的特性:外部化配置和配置随机值
    Java 之 Properties类 属性集
    Java 之 IO 异常的处理【了解】
    Java 之 字符输出流[Writer]
    Java 之 字符输入流[Reader]
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14731726.html
Copyright © 2011-2022 走看看