C语言分支与循环语句详解:结构化编程的核心

一、分支结构

1. if 语句(单分支)

这是 if 语句最基础的用法,仅在条件成立时执行特定代码块。

  • 语法格式

    运行if (条件表达式) {

  •     // 条件为真(非0)时执行的语句块
        语句1;
        语句2;
    }
    // 无论条件真假,都会执行的后续代码
    后续语句;
     

  • 执行逻辑
    1. 首先计算 “条件表达式” 的值。
    2. 若结果为真(非 0,如 1、-5、3.14 等),则执行大括号内的所有语句。
    3. 若结果为假(0),则跳过大括号内的语句,直接执行 “后续语句”。
  • 关键注意点
    • 条件表达式必须用小括号 () 包裹,这是语法要求,不可省略。
    • 若语句块仅包含 1 条语句,大括号 {} 可省略,但建议始终保留,避免后续添加代码时出现逻辑错误。

2. if-else 语句(双分支)

当需要 “二选一” 执行代码时,使用 if-else 结构,条件成立执行一段代码,不成立则执行另一段。

  • 语法格式

    if (条件表达式) {
        // 条件为真时执行的语句块(分支1)
    } else {
        // 条件为假时执行的语句块(分支2)
    }
     

  • 执行逻辑
    • 条件为真时,只执行 if 后的语句块,跳过 else 后的语句块。
    • 条件为假时,只执行 else 后的语句块,跳过 if 后的语句块。
    • 两个分支必有一个且仅有一个会被执行,不会同时执行或都不执行。
  • 典型应用场景
    • 判断一个数字是正数还是非正数。
    • 检查用户输入的密码是否正确(正确则登录,错误则提示)。
    • 判断学生成绩是否及格(及格显示 “通过”,不及格显示 “未通过”)。

3. if-else if-else 语句(多分支)

当需要判断多个条件、选择多个分支时,使用该结构,按顺序检查条件,满足首个条件即执行对应分支。

  • 语法格式

    if (条件1) {
        // 条件1为真时执行
    } else if (条件2) {
        // 条件1为假、条件2为真时执行
    } else if (条件3) {
        // 条件1、2为假,条件3为真时执行

    // ... 可添加更多else if
    else {
        // 所有条件都为假时执行(可选)
    }
     

  • 执行逻辑
    1. 从 “条件 1” 开始依次判断,一旦某个条件为真,就执行对应的语句块。
    2. 执行完该语句块后,直接跳出整个 if-else if-else 结构,不再检查后续条件。
    3. 若所有条件都为假,且存在 else 分支,则执行 else 内的语句块;若没有 else,则不执行任何分支。
  • 注意事项
    • else if 可以根据需求设置任意多个,数量没有限制。
    • else 是可选的,若所有条件之外的情况无需处理,可省略 else。

4. switch 语句 

switch 语句是 C 语言中另一种重要的分支结构,适用于多条件判断且条件值为离散常量的场景,比多层 if-else if 结构更简洁高效。

(1)switch 语句的基本语法

switch (表达式) {
    case 常量1:
        // 当表达式值等于常量1时执行的语句
        语句块1;
        break;  // 跳出switch结构
    case 常量2:
        // 当表达式值等于常量2时执行的语句
        语句块2;
        break;
    // ... 更多case分支
    default:
        // 当表达式值与所有case常量都不匹配时执行的语句(可选)
        语句块n;
        break;
}

(2)核心执行逻辑
  1. 先计算switch后括号中表达式的值(必须是整型或字符型,如 int、char 等)。
  2. 将表达式的值与各个case后的常量依次比较:
    • 若匹配某个常量,则从该case对应的语句块开始执行。
    • 若所有case都不匹配,且存在default,则执行default后的语句块。
  3. 遇到break语句时,立即跳出整个switch结构,执行后续代码。
(3)关键注意事项
  1. 表达式类型限制:表达式结果必须是整型或字符型(如 int、short、long、char 等),不能是浮点型(如 float、double)或字符串。

  2. case 常量要求

    • 必须是常量(如 10、'A'、宏定义的值),不能是变量或表达式。
    • 多个 case 不能使用相同的常量(会导致编译错误)。
  3. break 语句的作用

    • break用于终止当前 case 的执行并跳出 switch 结构。
    • 若省略break,会发生 **“case 穿透”**:执行完当前 case 后,会继续执行下一个 case 的语句(无论是否匹配),直到遇到 break 或 switch 结束。

    // 示例:case穿透现象
    int num = 2;
    switch(num) {
        case 1: printf("1 ");  // 不匹配,跳过
        case 2: printf("2 ");  // 匹配,执行
        case 3: printf("3 ");  // 无break,继续执行
        default: printf("end");
    }
    // 输出:2 3 end(而非仅输出2)
     

  4. default 的位置

    • default是可选分支,用于处理 “所有 case 都不匹配” 的情况。
    • 可放在 switch 中的任意位置(不一定在最后),但通常建议放在末尾。
(4)适用场景与优缺点
  • 适用场景:多条件判断且条件值为离散常量的情况,如:

    • 菜单选择(1 - 查看、2 - 添加、3 - 删除)。
    • 月份判断(1-12 月)。
    • 字符命令处理('A' 表示前进、'B' 表示后退)。

二、循环结构

1. while 循环(先判断后执行)

while 循环是最基础的循环形式,特点是 “先检查条件,再决定是否执行”,循环体有可能一次都不执行。

  • 语法格式
  • while (条件表达式) {
        // 条件为真时执行的循环体
        循环语句;
        // (关键)使条件趋于假的语句(如变量自增/自减)
    }
  • 执行逻辑
    1. 计算 “条件表达式” 的值。
    2. 若条件为真(非 0),执行循环体;执行完后回到步骤 1,再次判断条件。
    3. 若条件为假(0),直接跳出循环,执行循环后的代码。
  • 关键注意点
    • 必须在循环体内设置 “使条件趋于假” 的语句(如i++count--),否则会导致死循环(循环永远无法退出)。
    • 若循环体仅 1 条语句,大括号{}可省略,但建议保留以保证代码可读性。
  • 典型场景:不确定循环次数,仅知道循环终止条件(如 “读取用户输入,直到输入 0 为止”)。

2. do-while 循环(先执行后判断)

do-while 循环与 while 循环逻辑相似,核心区别是 “先执行 1 次循环体,再判断条件”,确保循环体至少执行 1 次。

  • 语法格式
    do {
        // 先执行1次的循环体
        循环语句;
        // 使条件趋于假的语句
    } while (条件表达式);  // 注意:末尾必须加分号
  • 执行逻辑
    1. 先执行 1 次循环体(无论条件是否成立)。
    2. 执行完后,计算 “条件表达式” 的值。
    3. 若条件为真,回到步骤 1 继续执行循环体;若为假,跳出循环。
  • 关键注意点
    • 循环体末尾的分号;不可省略,这是语法强制要求。
    • 适用场景明确:需要 “先执行,后判断” 的场景(如 “密码输入验证,必须先让用户输入 1 次密码再判断是否正确”)。

3. for 循环(初始化、判断、更新一体化)

for 循环是最常用的循环形式,将 “循环变量初始化、条件判断、变量更新” 三个操作集中在一处,结构紧凑、可读性高。

  • 语法格式

    for (初始化表达式; 条件表达式; 更新表达式) {
        // 条件为真时执行的循环体
        循环语句;
    }

  • 各部分作用
    • 初始化表达式:仅在循环开始时执行 1 次,用于定义和初始化循环变量(如int i = 0)。
    • 条件表达式:每次执行循环体前判断,为真则执行循环体,为假则退出(如i < 10)。
    • 更新表达式:每次执行完循环体后执行,用于修改循环变量(如i++),使条件趋于假。
  • 执行逻辑
    1. 执行 “初始化表达式”(仅 1 次)。
    2. 判断 “条件表达式”:
      • 若为真,执行循环体 → 执行 “更新表达式” → 回到步骤 2。
      • 若为假,跳出循环。
  • 灵活用法
    • 初始化、更新表达式可省略(但分号;不能省),如for (; i < 10; ) { ... }(类似 while 循环)。
    • 可同时控制多个变量,如for (int i = 0, j = 10; i < j; i++, j--)
  • 典型场景:已知明确循环次数的场景(如 “循环 10 次打印数字”“遍历数组的 10 个元素”)。

4. 循环控制语句

循环控制语句用于 “主动干预循环流程”,可提前跳出循环或跳过当前轮次,常用的有breakcontinue

(1)break 语句

  • 作用:立即跳出当前所在的循环(while/do-while/for)或 switch 语句,执行循环外的后续代码。
  • 语法示例

    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break;  // 当i=5时,直接跳出for循环
        }
        printf("%d ", i);  // 输出:0 1 2 3 4
    }

  • 注意break仅跳出 “当前一层循环”,若存在循环嵌套,不会影响外层循环。

(2)continue 语句

  • 作用:跳过当前轮次循环体的剩余语句,直接进入下一次循环的 “条件判断”(不终止循环)。
  • 语法示例

    for (int i = 0; i < 5; i++) {
        if (i == 2) {
            continue;  // 当i=2时,跳过下方printf,直接进入下一轮(i=3)
        }
        printf("%d ", i);  // 输出:0 1 3 4
    }
     

  • 注意continue不会修改循环变量,需确保循环变量在 “更新表达式” 或循环体内正常变化,避免死循环。

三、分支与循环的嵌套

1.分支结构的嵌套

在 if/else 或 switch 语句的语句块中,再次包含分支结构,用于处理多层级的条件判断。

(1) if 语句的嵌套(最常用)
  • 语法示例
  • if (外层条件) {
        // 外层条件为真
        if (内层条件1) {
            执行语句1;  // 外层+内层1均为真
        } else {
            执行语句2;  // 外层为真、内层1为假
        }
    } else {
        // 外层条件为假
        if (内层条件2) {
            执行语句3;  // 外层为假、内层2为真
        }
    }
  • 典型场景:多层级判断(如 “先判断是否成年,成年后再判断是否有驾照”)。
(2) switch 语句的嵌套
  • 语法示例

    switch (外层变量) {
        case 1:
            printf("选择1\n");
            switch (内层变量) {
                case 'A': printf("子选项A\n"); break;
                case 'B': printf("子选项B\n"); break;
            }
            break;
        case 2:
            printf("选择2\n");
            break;
    }
     

  • 注意事项:内层 switch 的 break 仅跳出内层结构,不影响外层 switch。

2.循环结构的嵌套

在一个循环的循环体中包含另一个循环,用于处理多维重复逻辑(如遍历二维数组、打印图形)。

(1) 常见嵌套组合
  • for 循环嵌套 for 循环(最常用):

    // 示例:打印3行4列的星号矩阵
    for (int i = 0; i < 3; i++) {  // 外层循环:控制行数
        for (int j = 0; j < 4; j++) {  // 内层循环:控制每行的列数
            printf("* ");
        }
        printf("\n");  // 每行结束后换行
    }

  • while 循环嵌套 for 循环

    int row = 0;
    while (row < 3) {  // 外层while控制行数
        for (int col = 0; col < 3; col++) {  // 内层for控制列数
            printf("%d ", row + col);
        }
        printf("\n");
        row++;
    }

(2)核心注意事项
  • 内层循环会完全执行完一轮,外层循环才会进入下一次(如上述矩阵示例,内层循环打印 4 个星号后,外层循环才换行)。
  • 避免过多嵌套层级(建议不超过 3 层),否则代码可读性和维护性会大幅下降。
  • 循环变量命名要区分(如外层用 i,内层用 j),避免变量冲突。

3.分支与循环的混合嵌套

分支结构与循环结构相互包含,是实际开发中最常用的组合,用于 “在循环中判断条件” 或 “在分支中执行重复操作”。

(1)循环中嵌套分支
  • 语法示例

    // 示例:遍历1-10,打印其中的偶数
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {  // 循环中判断是否为偶数
            printf("%d ", i);  // 输出:2 4 6 8 10
        }
    }

  • 典型场景:循环中筛选数据、根据条件执行不同操作(如防盗系统中,循环检测传感器状态,满足报警条件则触发报警)。
2. 分支中嵌套循环
  • 语法示例

    int choice = 2;
    if (choice == 1) {
        printf("打印3个数字:\n");
        for (int i = 1; i <= 3; i++) {  // 分支中执行循环
            printf("%d ", i);
        }
    } else {
        printf("打印2个字母:\n");
        int j = 0;
        while (j < 2) {  // 分支中执行while循环
            printf("%c ", 'A' + j);
            j++;
        }
    }
     

  • 典型场景:根据用户选择执行不同的循环操作(如菜单功能中,选择 “查看日志” 则循环打印日志,选择 “统计数据” 则循环计算数据)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值