C 语言流程控制之 break 与 continue:从基础用法到实战案例

        在 C 语言中,流程控制是实现复杂逻辑的核心,其中break和continue语句在循环与分支结构中扮演着重要角色。本文将详细解析两者的功能差异、使用场景,并通过实战案例演示其具体应用,同时介绍嵌套循环的跳出技巧,帮助初学者快速掌握这两个关键语句。## 流程控制

break与continue

break

功能:

        ①用在swith语句中,用来跳出switch中的case语句;如果case没有break,可能会产生case穿透。

        ②用在循环中(while...、for...、do...while),提前结束循环,也就是整个循环。

说明:

        ①break不能用于循环语句和switch语句之外的其他任何语句中。

        ②break只能终止并跳出最近的一层循环结构,只能跳出一层循环。

图示:

举例:吃苹果,吃到第2个有虫子,恶心不吃了,吃了1个苹果

案例:

        需求:考试不及格就一直考试。代码

/*************************************************************************
  > File Name:    demo01.c
  > Author:       千夕
  > Description:  
  > Created Time: 2025年07月16日 星期三 09时27分50秒
 ************************************************************************/
    
#include <stdio.h>

int main(int argc,char *argv[])
{
    printf("--- 分支结构测试 ---\n");

    // 创建一个变量,用来存储成绩
    int score;

    // 创建一个循环,实现重复考试
    do
    {
        printf("鸿哥开始考试...\n");
        scanf("%d", &score);

        // 考试及格,就终止循环
        if (score >= 60) break; // break执行后,下面的printf语句是否会执行?不会执行

        printf("很遗憾,没有及格,再考一次!\n");

    } while(1);// 可控死循环

    printf("成绩合格,考试结束!\n");


    return 0;
}

运行结果:

continue

        功能:不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环。

        说明:

                ①仅用于循环语句中

                ②在嵌套循环的情况下,只对包含他的最近一层循环起作用,简而言之,只能作用于单层循环。

举例:吃苹果,吃到第2个有虫子,恶心不吃了这个,又吃了2个苹果,共吃了3个。

案例:

        需求:求1~100以内的偶数和

        代码:

/*************************************************************************
  > File Name:    demo02.c
  > Author:      千夕
  > Description:  
  > Created Time: 2025年07月16日 星期三 09时52分11秒
 ************************************************************************/

    #include <stdio.h>

/**
 * 不使用continue
 */ 
int for_test1()
{
    int sum = 0;

    for (int i = 2; i <= 100; i++)
    {
        if (i % 2 == 0) sum += i;
    }

    printf("1~100以内的偶数和是%d\n", sum);

    return 0;
}

/**
 * 使用continue
 */ 
int for_test2()
{
    int sum = 0;

    for (int i = 2; i <= 100; i++)
    {
        // 跳过奇数
        if (i % 2 != 0) continue; // 执行了continue之后, 下面的 sum += i 不再执行

        sum += i;  
    }

    printf("1~100以内的偶数和是%d\n", sum);

    return 0;
}

int main(int argc,char *argv[])
{
    for_test1();
    for_test2();

    return 0;
}

跳出嵌套循环(扩展)

        说明:跳出多层循环是不能直接使用break和continue实现的,因为它们只能跳出单层循环,跳出多层循环,需要我们自定义标志位进行跳出(标志位也可以配合break使用)。

        案例

```c
/*************************************************************************
  > File Name:    demo02_2.c
  > Author:       千夕
  > Description:  
  > Created Time: 2025年07月16日 星期三 10时01分11秒
 ************************************************************************/
#include <stdio.h>

/**
 * 方式1
 */
int func0()
{
    // 定义一个标志位
    int is_flag = 1; // 默认循环成立
    // 定义一个变量,接收控制台输入
    char op;
    
    // 循环
    while (is_flag)
    {
        printf("外层循环执行的内容..\n");
        
        while (is_flag)
        {
            printf("内层循环执行的内容..\n");
            scanf("%c", &op);
            if (op == 'Y' || op == 'y')
            {
                // 退出参与嵌套的所有循环
                is_flag = 0;
            }
        }
    }
}

/**
 * 方式2
 */
int func1()
{
    // 定义一个标志位
    int is_flag = 1; // 默认循环成立
    // 定义一个变量,接收控制台输入
    char op;
    
    // 循环
    while (is_flag)
    {
        printf("外层循环执行的内容..\n");
        
        while (1)
        {
            printf("内层循环执行的内容..\n");
            scanf("%c", &op);
            if (op == 'Y' || op == 'y')
            {
                // 退出参与嵌套的所有循环
                is_flag = 0;
                break;
            }
        }
    }
}


int main(int argc, char **argv)
{
    func0();
    printf("-------\n");
    func1();
}
注意:如果是多层循环(嵌套循环),进的时候是从外到内,跳出的时候是从
内到外。

综合案例《猜拳游戏》

需求:

​    单机游戏,人机交互

规则:

​    双方出石头剪刀布

获胜:

​    石头→剪刀

​    剪刀→布

​    布→石头

平手:

​    两边出的一样

实现:

1)选择对手

2)玩家出拳

3)对手出拳

4)判断胜负5)游戏推出代码:

/*************************************************************************
  > File Name:    caiquan.c
  > Author:       千夕
  > Description:  
  > Created Time: 2025年07月16日 星期三 12时36分48秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc,char *argv[])
{
    // 初始化随机种子
    srand((unsigned)time(NULL));

    // 游戏住循环控制 (默认是可以重复玩)
    int game_running = 1;

    // 游戏头设置
    printf("===================\n");
    printf("== 猜拳游戏  v1.0 =\n");
    printf("==    作者:pp    =\n");
    printf("===================\n");

    // 主循环
    while (game_running)
    {
        // 选择对手
        printf("\n-----请选择对手-----\n");
        // 创建一个变量,用来存储对手对应的序号
        int opponent;
        while (1)
        {
            printf("\n选择对手:[1] 哪吒  [2] 敖丙 [3]敖闰: ");
            // 处理非法输入
            if (scanf("%d", &opponent) != 1)
            {
                // 清空输入缓冲区非法字符
                while (getchar() != '\n');
                printf("请输入数字1~3! \n");
                continue;
            }
            // 验证输入范围
            if (opponent >= 1 && opponent <= 3)break;
            printf("选择无效,请重新输入!\n");
        }

        // 显示对手信息,使用const修饰的变量还是变量,只不过不能再次赋值。
        const char *opponent_name = opponent == 1 ? "哪吒"  : opponent == 2 ? "敖丙" : "敖闰";
        printf("对手,%s\n", opponent_name);

        // 2.玩家出拳
        printf("\n-----玩家出拳-----\n");
        //创建一个变量,用来存储玩家自己出拳的序号
        int player_gesture;
        while(1)
        {
            printf("\n请出拳: [1] 石头  [2] 剪刀   [3] 布 :\n");
            //非法校验
            if (scanf("%d", &player_gesture) != 1)
            {
                while (getchar() != '\n'); 
                printf("请输入数字1~3!\n");
                continue;
            }
    

        //输入范围校验
            if (player_gesture >= 1 && player_gesture <= 3) break;
            printf("无效输入,请重新输入! \n");
        }

         //显示玩家出拳信息
         const char* player_gesture_name = player_gesture == 1 ? "石头" : player_gesture == 2 ? "剪刀": "布";
         printf("您出: %s\n",player_gesture_name);

         //3. 对手出拳
        printf("\n---对手出拳---\n");
        //创建一个变量,作为对手的出拳序号,随机生出1~3
        int computer_gesture = rand() % 3 + 1;
        const char* computer_gesture_name = computer_gesture == 1 ? "石头" : computer_gesture == 2 ? "剪刀" : "布";

         //显示对手出拳信息
        printf("%s出: %s\n", opponent_name , computer_gesture_name);

        // 4.判断胜负
        printf("\n--- 判断胜负 ---\n");
        //创建一个变量,存储比较结果
        int result = (player_gesture - computer_gesture + 3) % 3;
        printf("战况:");
        //比较
        if (result == 0) printf("平局!\n");
        else if (result == 2) printf("您赢了!\n");
        else printf("您输了~~~ \n");

        // 5.游戏退出
        printf("\n----游戏退出 ----\n");

        printf("继续游戏? [Y/N]");
        //清空输入缓冲区
        while (getchar() != '\n');
        //获取控制台输入
        char choice = getchar();
        //修改循环状态
        game_running = choice == 'Y' || choice == 'y' ? 1 : 0;
    }

        printf("\n游戏结束! \n");

    return 0;
}

运行结果:

实战建议

  1. 避免过度使用breakcontinue会改变程序的线性执行流程,过多使用可能导致代码逻辑混乱,简单场景下优先通过循环条件控制。
  2. 嵌套循环注意:多层嵌套中,若需跳出所有循环,建议使用标志位如猜拳游戏中的game_running),比多层break更清晰。
  3. 输入校验必备:处理用户输入时,continue是过滤无效输入的高效方式(如猜拳游戏中的输入校验)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值