当前位置: 首页 > news >正文

C语言基础要素(018):循环控制:break与continue

嵌套循环

循环也可以嵌套,即当前循环的语句部分可以是另一个循环语句。嵌套循环从外层向内层执行,外层每执行一次,内层执行N次,直至外层循环到达结束条件。

#include <stdio.h>

int main()
{
    // 外层循环
    for (char c = 'A'; c <= 'D'; c++)
    {
        // 内层循环
        for (int i = 1; i < 6; i++)
            printf("%c%d\t", c, i);
        printf("\n");
    }

    return 0;
}

在这里插入图片描述

示例程序中,外层循环控制字母A-D,内层循环控制编号1-5。当外层循环是’A’时,内层循环迭代5次,组合输出A1-A5,随后输出一个换行符,以让本次内外层结果与下次分开;接着外层循环字符递增到’B’,内层循环又从1开始到5,输出B1-B5,以此类推。当然,同样的程序也可以使用嵌套while循环来编写,甚至是两者的混合。

#include <stdio.h>

int main()
{
    int i = 0;

    while (i < 6)
    {
        for (char c = 'A' + i; c <= 'F'; c++)
        {
            printf("%c", c);
        }

        printf("\n");
        i++;
    }

    return 0;
}

在这里插入图片描述

break 语句

目前我们的循环程序,需要在入口条件或退出条件满足时才能得以结束。有时你可能需要在循环过程中提前结束,比如说通过循环查找一个数值是否在一组数据中,如果找到且能提前退出循环,就可以避免后续的无用查找,提高程序效率。break语句可用于从for、while与do-while循环中提前退出,就如同从switch语句中提前退出一样。

#include <stdio.h>

int main()
{
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", i);
        if (i == 5)
            break;
    }

    printf("\nhere....");

    return 0;
}

在这里插入图片描述

在嵌套循环中,break语句仅能退出当前所属循环

#include <stdio.h>

int main()
{
    for (int i = 9; i > 6; i--)
    {
        for (int j = 0; j < 100; j++)
        {
            // 成立时仅退出当前所属循环
            if (j == 5)
                break;
            printf("%d%d ", i, j);
        }
        printf("...\n");
    }

    return 0;
}

在这里插入图片描述

#include <stdio.h>

int main()
{
    for (int i = 9; i > 6; i--)
    {
        for (int j = 0; j < 100; j++)
        {
            // 退出所属的j循环
            if (j == 5)
                break;
            printf("%d%d ", i, j);
        }

        // 退出所属的i循环
        break;
    }

    printf("...\n");
    return 0;
}

在这里插入图片描述

continue语句

如果循环需要在某些情况下跳过本次操作,continue可以做到。continue语句可用于三种循环形式。当运行该语句时,当前循环体的后续语句被忽略,继而开始下一次迭代。对for循环而言,这使控制转移到循环变量更新部分。在下面的程序,当i=3时,continue导致后续的语句不再执行,即本次循环体完成,然后跳转执行for的i++部分,以进行下次迭代。

#include <stdio.h>

int main()
{
    for (int i = 0; i < 5; i++)
    {
        printf("%d: first second ", i);

        if (i == 3)
        {
            printf("\n");
            continue;
        }

        printf("third\n");
    }

    return 0;
}

在这里插入图片描述

在while与do-while语句中,continue语句的执行意味着立即执行测试部分,即入口或退出条件部分;这暗含着我们可能需要在此之前编写循环的更新部分代码,得以让程序正确运行。

#include <stdio.h>

int main()
{
    int i = 0;

    do
    {
        printf("%d: first second ", i);

        if (i == 3)
            continue;

        printf("third\n");
        i++;
    }
    while (i < 5);

    return 0;
}

在这里插入图片描述

循环的前3次一切顺利。但当i=3时,continue致使do-while执行退出条件部分i<5,此时条件成立,执行循环体,但并没有更新i,使得程序进入一个无限输出状态。解决方法就是添加循环变量更新语句,下面是同等的while版本。

#include <stdio.h>

int main()
{
    int i = 0;

    while (i < 5)
    {
        printf("%d: first second ", i);

        if (i == 3)
        {
            printf("\n");
            i++;            // 重要:在continue之前更新循环控制变量
            continue;
        }

        printf("third\n");
        i++;
    }

    return 0;
}

在这里插入图片描述

无限循环

在之前无限输出的do-while示例中,由于条件判断部分永远为真,使得循环进入一种退不出的状态,这样的循环称为无限循环或死循环。

for (;;)          // for语句的三个表达式可省略,这表示条件部分求值永远为真。
    printf("Z");

while (1)
    printf("Y");

do {
    printf("F");
} while(1);

你可能认为编写这种无限循环是一种错误的设计,事实却是许多应用软件都包含类似的结构。比如说游戏类程序,运行在这样一个无限循环中,在其中获取用户输入、渲染场景、输出画面等,直到用户按下退出按钮,此时设置循环控制变量为假,或使用break中断循环。

int key = 0;
bool game_over = false;

while (!game_over)
{
    // 从键盘获取用户输入

    if (key == 96)
        game_over = true;

    // 游戏逻辑...
}

练习

  1. 转置第一个循环使得它有如下输出。
A1  B1  C1  D1
A2  B2  C2  D2
A3  B3  C3  D3
A4  B4  C4  D4
A5  B5  C5  D5
  1. 编写一个三层嵌套循环。
  2. 编写密码输入程序,使得用户最多只能输错3次,密码用一个数字代替。
  3. 使用无限循环打印字母 ‘F’ 20次。

相关文章:

  • leetcode0525. 连续数组-medium
  • Linux shift 命令使用详解
  • C++中使用ShellExecute函数调用其他窗口程序时,参数设置为隐藏,后续能通过发消息给这个被调用程序显示,能显示出来窗口吗
  • 汽车加气站操作工证书报考条件是什么?
  • 【计算机操作系统】第一章操作系统引论
  • 优选算法系列(4.前缀和 _下) k
  • Deepseek API+Python 测试用例一键生成与导出 V1.0.4 (接口文档生成接口测试用例保姆级教程)
  • OkHttp 的证书设置
  • QOpenGLWidget视频画面上绘制矩形框
  • Redis简单介绍和安装
  • 版本控制工具
  • 树莓派超全系列文档--(8)RaspberryOS实用程序
  • 【C#.NET】VS2022创建Web API项目
  • Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-02)
  • D3802ACF:高精度 PSR LED 恒流驱动电路详解
  • L2-3 龙龙送外卖(天梯赛)
  • mysql5.7无法启动报错处理无日志
  • 吴恩达机器学习笔记复盘(十二)逻辑回归的梯度下降和拟合问题
  • 《基于python游戏设计与实现》开题报告
  • 如何用JavaScript验证身份证号码?
  • 魔都眼|咖啡节上上海小囡忍不住尝了咖啡香,母亲乐了
  • 此前显示售罄的火车票“五一”前大量放出来了?12306回应
  • 海口市政协党组成员、秘书长、机关党组书记汪娟被查
  • 美国清洗政治:一幅残酷新世界的蓝图正在展开
  • 坚持科技创新引领,赢得未来发展新优势
  • 浙商银行一季度净赚超59亿微增0.61%,非息净收入降逾22%