OneCoder Avatar
OneCodercoderli.com · 937 篇博文
二级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【GESP】C++二级考试大纲知识点梳理, (7)多层分支结构

📅 2026-01-02·✍️ OneCoder·计算中...·⏱️ 10 分钟
#GESP#C++#考试大纲#分支嵌套

程序并不总是一条直线走到底,经常需要根据情况“拐弯”。一级考试要求掌握简单的 if,而二级考试的难度立刻升级到了多层嵌套。这就是逻辑思维能力的体现。本篇详细剖析大纲第 7 条考点。

(7)掌握多层分支结构,掌握 if 语句、if...else 语句、switch 语句,及相互嵌套的方法。 {: .prompt-info}

二级考点系列:


一、多层分支结构 (Nested if-else)

所谓的“多层分支”,通俗点说就是套娃:在 ifelse 的大括号里,再写 if。 这通常用于处理多维度递进式的判断条件。

1.1 语法结构

CPP
if (条件A) {
    if (条件B) {
        // 条件A 和 条件B 都满足
    } else {
        // 条件A 满足,但 条件B 不满足
    }
} else {
    // 条件A 不满足
}

1.2 经典案例:闰年判断

判断某一年是否为闰年,是嵌套分支的经典练兵场。

规则

  1. 能被 4 整除。
  2. 但(如果是整百年)必须能被 400 整除。

写法 1:逻辑运算符(扁平化,推荐)

CPP
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
    cout << "是闰年";
}

写法 2:嵌套结构(层层递进,考点所在)

CPP
if (year % 4 == 0) {
    // 可能是,还得看是不是整百
    if (year % 100 == 0) {
        // 是整百,那得看能不能被400整除
        if (year % 400 == 0)
            cout << "是闰年";
        else
            cout << "不是闰年";
    } else {
        // 能被4整除且不是整百
        cout << "是闰年";
    }
} else {
    cout << "不是闰年";
}

虽然写法 2 看着繁琐,但它清晰展示了判断的步骤。在复杂的业务逻辑中,嵌套结构往往比一个超长的 && / || 表达式更容易阅读和调试。

1.3 悬空 else 问题 (Dangling else)

这是一个经典的 C++ 坑点。原则else 总是与最近的、未配对的 if 结合。

CPP
if (A)
    if (B)
        cout << "B";
else // 这个 else 属于谁?
    cout << "C";

答案:这个 else 属于 if(B)!如果 A 为真且 B 为假,输出 C。如果 A 为假,啥也不输出。 建议:无论只有一行代码还是多行,永远加上大括号 {},这样能彻底杜绝歧义。

CPP
if (A) {
    if (B) {
        cout << "B";
    } else {
        cout << "C";
    }
}

二、Switch 语句

switch 是一种专门用于多选一的结构,特别适合判断整型字符型的具体数值(离散值)。

2.1 语法结构

CPP
switch (表达式) {
    case 常量1:
        // 代码块 1
        break; // 必不可少!
    case 常量2:
        // 代码块 2
        break;
    ...
    default:
        // 如果上面都没匹配上,执行这里
        break;
}

2.2 核心要点

  1. 类型限制switch 括号里的表达式结果必须是 整数 (int, long, char)。不能是 double,也不能是字符串。

  2. Break 非常重要

    • break 的作用是跳出 switch。
    • 如果没有 break,程序会**“穿透” (Fall-through)**:继续向下执行下一个 case 的代码,不管条件是否匹配!
    • 利用穿透特性: 比如输入月份判断季节,3,4,5 月都是春季,可以写在一起。
      CPP
      switch (month) {
          case 3:
          case 4:
          case 5:
              cout << "春季";
              break;
      }
      
  3. Case 必须是常量:不能写 case a > 5: 这种范围判断。

2.3 案例:简单的计算器

输入两个数和一个运算符 + - * /,输出结果。

CPP
double a, b;
char op;
cin >> a >> op >> b;

switch (op) {
    case '+':
        cout << a + b;
        break;
    case '-':
        cout << a - b;
        break;
    case '*':
        cout << a * b;
        break;
    // 注意除法分母不能为0
    case '/':
        if (b != 0) cout << a / b;
        else cout << "Error";
        break;
    default:
        cout << "无效符号";
}

三、if-else if 还是 switch?

场景 推荐使用 理由
范围判断 (如 score >= 90) if-else switch 没法直接处理范围
浮点数判断 if-else switch 不支持 float/double
特定点值匹配 (如 按下按键 1, 2, 3) switch 代码结构更清晰,效率略高
复杂逻辑 (嵌套多) if-else 灵活性最强

四、备考技巧

  1. 缩进要规范:写嵌套分支时,一定要注意代码缩进。乱糟糟的格式会让你在检查逻辑时瞬间崩溃。
  2. 大括号不要省:虽然 C++ 允许单行省略 {},但考试或写复杂逻辑时,请务必加上。
  3. 注意边界:多层分支极其容易漏掉某些情况(比如 else 没写全),写完代码后,试着在脑子里跑几个测试用例覆盖所有分支。

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

GESP 编程与算法 · 二级⏱️ 14 分钟

【GESP】C++二级考试大纲知识点梳理, (1)计算机存储的基本概念及分类

GESP C++二级官方考试大纲中,共有9条考点,本文针对C++(1)号知识点进行总结梳理。 (1)了解计算机存储的基本概念及分类,了解随机存储器(RAM)、只读存储器(ROM)和高速缓冲存储器(Cache)的功能及区别。 {: .prompt-info} 二级考点系列: - 【GESP】C++二级考试大纲知识点梳理,...

阅读全文 →
GESP 编程与算法 · 二级⏱️ 29 分钟

【GESP】C++二级考试大纲知识点梳理, (2)计算机网络的基本概念及分类

GESP C++二级官方考试大纲中,共有9条考点,本文针对C++(2)号知识点进行总结梳理。 (2)了解计算机网络的概念,了解计算机网络的分类(广域网(WAN)、城域网(MAN)、局域网(LAN)),了解计算机网络的层级结构及作用(TCP/IP 四层模型与 OSI七层模型),了解不同层级的重要协议,了解 IP 地址及子...

阅读全文 →
GESP 编程与算法 · 二级⏱️ 14 分钟

【GESP】C++二级考试大纲知识点梳理, (3)计算机程序设计语言相关知识

GESP C++二级官方考试大纲中,共有9条考点,本文针对C++(3)号知识点进行总结梳理。 (3)了解程序设计语言的几大分类及特点(机器语言、汇编语言、高级语言),了解常见的高级语言(C++、Python 等)。 {: .prompt-info} 二级考点系列: - 【GESP】C++二级考试大纲知识点梳理, (1)...

阅读全文 →
OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!