C/C++基础(五):分支

文章目录

一.if 语句

if 语句是 C/C++ 中最基础的条件分支语句,根据条件的真假执行不同的代码块,核心是 "满足条件则执行,不满足则跳过" .

1.单层 if

I.单分支

  1. 语法格式

    C++ 复制代码
    if (条件表达式) {
        // 条件为真时执行的代码块(可多条语句)
    }
    // 条件为假时,直接执行后续代码
    • 条件表达式:可以是关系表达式、逻辑表达式,或任意数值(0 为假, 非 0 为真);
    • 若代码块只有一条语句,{} 可省略(但不推荐,易引发语法错误).
  2. 示例代码

    C++ 复制代码
    #include <stdio.h>
    int main() {
        int score = 85;
        // 单分支:判断分数是否及格
        if (score >= 60) {
            printf("成绩及格\n");
        }
        printf("程序结束\n"); // 无论条件真假,都会执行
        return 0;
    }

II.双分支

  1. 语法格式

    c 复制代码
    if (条件表达式) {
        // 条件为真时执行的代码块
    } else {
        // 条件为假时执行的代码块
    }
    • 二选一执行:条件为 真走 if 块,为 假走 else 块,不会同时执行.
  2. 示例代码

    C++ 复制代码
    #include <stdio.h>
    int main() {
        int age = 17;
        // 双分支:判断是否成年
        if (age >= 18) {
            printf("已成年,可独立购票\n");
        } else {
            printf("未成年,需监护人陪同\n");
        }
        return 0;
    }

III.多分支

  1. 语法格式

    C++ 复制代码
    if (条件表达式1) {
        // 条件1为真时执行
    } else if (条件表达式2) {
        // 条件1为假、条件2为真时执行
    } else if (条件表达式3) {
        // 条件1、2为假、条件3为真时执行
    }
    // 可添加更多else if分支
    else {
        // 所有条件都为假时执行(可选)
    }
    • 执行逻辑:从上到下依次判断条件,只要某一个条件为真,执行对应代码块后直接跳出整个 if 结构;
    • else 为兜底分支,可省略(若所有条件都不满足,则无分支执行).
  2. 示例代码

    C++ 复制代码
    #include <stdio.h>
    int main() {
        int score = 88;
        // 多分支:成绩等级判断
        if (score >= 90) {
            printf("等级:A\n");
        } else if (score >= 80) {
            printf("等级:B\n"); // 此分支执行
        } else if (score >= 70) {
            printf("等级:C\n");
        } else if (score >= 60) {
            printf("等级:D\n");
        } else {
            printf("等级:E(不及格)\n");
        }
        return 0;
    }

2.if 嵌套

  1. 语法格式

    if 语句的代码块中可嵌套另一个 if/if-else/if-else if 结构,形成多层条件判断:

    C++ 复制代码
    if (外层条件) {
        // 外层条件为真时执行
        if (内层条件) {
            // 内层条件为真时执行
        } else {
            // 内层条件为假时执行
        }
    } else {
        // 外层条件为假时执行
    }
  2. 示例代码

    C++ 复制代码
    #include <stdio.h>
    int main() {
        int score = 85;
        int isAbsent = 0; // 0:未缺考,1:缺考
        // 外层:判断是否缺考
        if (isAbsent == 0) {
            // 内层:判断成绩等级
            if (score >= 80) {
                printf("未缺考,成绩等级:良好\n");
            } else {
                printf("未缺考,成绩等级:合格\n");
            }
        } else {
            printf("缺考,无成绩\n");
        }
        return 0;
    }
  3. 注意事项

    嵌套层级不宜过多(建议 ≤3 层),否则代码可读性差;

    花括号{}要匹配,避免因缩进错误导致逻辑混乱(例如省略{}时,else 默认匹配最近的 if).

3.条件运算符和表达式

条件运算符(?:)是 C/C++ 中唯一的三目运算符,可简化简单的 if-else 逻辑,等价于 "条件判断 + 二选一赋值 / 执行".

  1. 语法格式

    C++ 复制代码
    条件表达式 ? 表达式1 : 表达式2;

执行逻辑:

先判断 "条件表达式" 的真假;

  • 若为,执行并返回 "表达式 1" 的结果;
  • 若为,执行并返回 "表达式 2" 的结果.
  1. 核心特点

    • 可作为表达式直接赋值(这是与 if-else 的核心区别);
    • 优先级低于 关系 / 逻辑运算符,高于赋值运算符;
    • 结合性为 "右结合"(多层嵌套时从右往左解析).
  2. 示例代码

C++ 复制代码
#include <stdio.h>
int main() {
    // 1. 基础用法:替代简单if-else赋值
    int a = 10, b = 20;
    int max = (a > b) ? a : b; // 条件为假,max=20
    printf("最大值:%d\n", max);

    // 2. 嵌套用法:替代多层if-else(不推荐过度嵌套)
    int score = 75;
    char grade = (score >= 90) ? 'A' :
                 (score >= 80) ? 'B' :
                 (score >= 70) ? 'C' :
                 (score >= 60) ? 'D' : 'E';
    printf("成绩等级:%c\n", grade); // C

    // 3. 直接输出(表达式可作为函数参数)
    int age = 16;
    printf("是否成年:%s\n", (age >= 18) ? "是" : "否"); // 否

    return 0;
}
  1. 注意事项
    仅适用于 "二选一" 的简单逻辑,复杂逻辑(如多分支、代码块)仍用 if;
    表达式 1表达式 2 的类型需兼容(如都是 int、都是 char*),否则会触发类型转换(可能导致错误).

二.switch 语句

switch 是多分支选择语句,适用于 "一个表达式等于多个常量值" 的场景,比多层 if-else if 更简洁、高效.

  1. 核心语法

    c 复制代码
    switch (表达式) {
        case 常量值1:
            // 表达式等于常量值1时执行的代码
            break; // 可选,跳出switch结构
        case 常量值2:
            // 表达式等于常量值2时执行的代码
            break;
        // 可添加多个case分支
        default:
            // 表达式不等于任何case常量时执行的代码(可选)
            break;
    }
  2. 关键规则

    • 表达式类型:只能是整数类型(intchar、枚举 enum),或可隐式转换为整数的类型(如 short),不支持浮点型(double/float)、字符串;
    • case 常量:必须是 字面量 / 常量表达式(如 10'A'枚举值),不能是变量 (如 case a: 错误);
    • break 关键字:若省略 break,会触发 "case 穿透"------ 执行完当前 case 后,继续执行下一个 case 的代码,直到遇到 breakswitch 结束;
    • default 分支:可选,位置可任意(建议放在最后),若所有 case 都不匹配则执行 default;
    • 花括号 {}:必须加,即使只有一个 case 分支.
  3. 基础示例(无穿透)

    c++ 复制代码
    #include <stdio.h>
    int main() {
        int weekday = 3;
        switch (weekday) {
            case 1:
                printf("星期一\n");
                break;
            case 2:
                printf("星期二\n");
                break;
            case 3:
                printf("星期三\n"); // 执行此分支
                break;
            case 4:
                printf("星期四\n");
                break;
            case 5:
                printf("星期五\n");
                break;
            case 6:
                printf("星期六\n");
                break;
            case 7:
                printf("星期日\n");
                break;
            default:
                printf("无效的星期数\n");
                break;
        }
        return 0;
    }
  4. 进阶示例(case 穿透)

    利用 "case 穿透" 可实现 "多个常量值执行同一逻辑":

    c++ 复制代码
    #include <stdio.h>
    int main() {
        int month = 2;
        // 判断月份所属季节(穿透用法)
        switch (month) {
            case 3:
            case 4:
            case 5:
                printf("%d月:春季\n", month);
                break;
            case 6:
            case 7:
            case 8:
                printf("%d月:夏季\n", month);
                break;
            case 9:
            case 10:
            case 11:
                printf("%d月:秋季\n", month);
                break;
            case 12:
            case 1:
            case 2:
                printf("%d月:冬季\n", month); // 执行此分支
                break;
            default:
                printf("无效的月份\n");
                break;
        }
        return 0;
    }
  5. 注意事项

    • case 穿透的坑:若忘记加 break,会导致逻辑错误(例如上述示例中若 case 3 后无 break,输入 3 会同时输出 "春季" 和 "夏季");
    • default 的位置:若 default 放在 case 之前,需加 break,否则会穿透到后续 case;
    • switch vs if-else if:
      • switch 适合 "等值判断"(表达式等于常量),代码更简洁;
      • if-else if 适合 "范围判断"(如 score >= 80),灵活性更高;
    • C++ 增强:C++11 及以上支持 switch 中使用 enum class(强类型枚举),需显式转换为整数.

总结

  1. if 语句:

    • 单分支:满足条件执行;
    • 双分支:二选一执行;
    • 多分支:范围判断优先;
    • 嵌套:多层条件,控制层级;
    • 条件运算符:简化简单二选一逻辑,可直接赋值.
  2. switch 语句:

    • 适用于等值判断,依赖 break 避免穿透;
    • 仅支持整数类型表达式,case 为常量;
    • 穿透特性可简化多常量同一逻辑的场景.
  3. 选型原则:

    • 范围判断 →if-else if;
    • 等值判断 →switch;
    • 简单二选一 → 条件运算符.
    • 掌握分支语句的核心是理清 "条件判断逻辑" 和 "执行路径",避免因语法细节(如 break 缺失、花括号省略)导致逻辑错误.
相关推荐
Dillon Dong4 小时前
从C到Simulink: 使用STM32硬件支持包后为什么还不支持PC仿真ARM建模程序
c语言·stm32·simulink
Thera7774 小时前
状态机(State Machine)详解:原理、优缺点与 C++ 实战示例
开发语言·c++
linux开发之路5 小时前
C++高性能日志库开发实践
c++·c++项目·后端开发·c++新特性·c++校招
刻BITTER5 小时前
在TRAE 上安装PlatformIO
c++·单片机·嵌入式硬件·arduino
永远都不秃头的程序员(互关)5 小时前
C++动态数组实战:从手写到vector优化
c++·算法
水力魔方6 小时前
武理排水管网模拟分析系统应用专题5:模型克隆与并行计算
数据库·c++·算法·swmm
OliverH-yishuihan7 小时前
在win10上借助WSL用VS2019开发跨平台项目实例
linux·c++·windows
汉克老师7 小时前
GESP2025年12月认证C++二级真题与解析(编程题1 (环保能量球))
c++·gesp二级·gesp2级
郝学胜-神的一滴8 小时前
Linux进程与线程控制原语对比:双刃出鞘,各显锋芒
linux·服务器·开发语言·数据结构·c++·程序人生
青岛少儿编程-王老师8 小时前
CCF编程能力等级认证GESP—C++2级—20251227
java·开发语言·c++