5C++ Primer(第5版)

语句

控制流

条件语句循环跳转语句

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第5章:语句(Statements)

一、导读

1.1 本章学习目标

第5章讲解C++的控制流语句。本章核心目标:

  • 掌握条件语句:if、switch的用法和注意事项
  • 熟练使用循环语句:for、while、do-while、范围for
  • 理解break和continue:控制循环流程
  • 掌握异常处理:try-throw-catch机制
  • 了解goto语句:为什么不推荐使用

1.2 为什么本章如此重要

控制流是程序逻辑的核心。C++的控制流语句与C语言类似,但在类型安全和初始化方面有更严格的要求。特别是C++11的范围for语句,大大简化了容器遍历。

1.3 核心问题引导

switch语句中的fall-through问题如何避免?

范围for和传统for循环有什么本质区别?

C++的异常处理和C的错误码方式相比有什么优势?

为什么goto语句不推荐使用?有没有替代方案?


二、核心概念详解

5.1 if语句

cpp
#include <iostream>

int main() {
    int score = 85;
    
    // 基本if-else
    if (score >= 90) {
        std::cout << "A" << std::endl;
    } else if (score >= 80) {
        std::cout << "B" << std::endl;
    } else {
        std::cout << "C" << std::endl;
    }
    
    // if中初始化变量(C++17)
    // if (auto it = map.find(key); it != map.end()) {
    //     std::cout << it->second << std::endl;
    // }
    
    // 注意:条件表达式会隐式转换为bool
    int* ptr = nullptr;
    if (ptr) {  // 等价于 ptr != nullptr
        std::cout << "ptr is not null" << std::endl;
    }
    
    return 0;
}

5.2 switch语句

cpp
#include <iostream>

int main() {
    char grade = 'B';
    
    switch (grade) {
        case 'A':
            std::cout << "Excellent" << std::endl;
            break;  // 别忘了break!
        case 'B':
            std::cout << "Good" << std::endl;
            break;
        case 'C':
            std::cout << "Fair" << std::endl;
            break;
        case 'D':
        case 'F':
            std::cout << "Need improvement" << std::endl;
            break;  // D和F共享同一段代码
        default:
            std::cout << "Invalid grade" << std::endl;
    }
    
    // C++17 带初始化的switch
    // switch (auto val = getValue(); val) { ... }
    
    return 0;
}

5.3 循环语句

cpp
#include <iostream>
#include <vector>

int main() {
    // while循环
    int n = 5;
    while (n > 0) {
        std::cout << n << " ";
        n--;
    }
    std::cout << std::endl;
    
    // do-while循环(至少执行一次)
    int input;
    do {
        std::cout << "Enter positive number: ";
        std::cin >> input;
    } while (input <= 0);
    
    // for循环
    for (int i = 0; i < 10; i++) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    
    // 范围for(C++11)
    std::vector<int> nums = {1, 2, 3, 4, 5};
    for (int x : nums) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    // 范围for修改元素
    for (int &x : nums) {
        x *= 2;
    }
    
    // 基于初始化语句的for(C++20)
    // for (int i = 0, j = 10; i < j; i++, j--) { ... }
    
    return 0;
}

5.4 break、continue和异常处理

cpp
#include <iostream>
#include <stdexcept>

int main() {
    // break:跳出循环
    for (int i = 0; i < 100; i++) {
        if (i * i > 50) {
            std::cout << "First square > 50: " << i << std::endl;
            break;
        }
    }
    
    // continue:跳过本次迭代
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) continue;
        std::cout << i << " ";  // 只输出奇数
    }
    std::cout << std::endl;
    
    // 异常处理
    try {
        int a = 10, b = 0;
        if (b == 0) {
            throw std::runtime_error("Division by zero");
        }
        std::cout << a / b << std::endl;
    } catch (const std::runtime_error &e) {
        std::cerr << "Error: " << e.what() << std::endl;
    } catch (const std::exception &e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    } catch (...) {
        std::cerr << "Unknown error" << std::endl;
    }
    
    return 0;
}

三、实战案例

3.1 简单菜单系统

cpp
#include <iostream>
#include <string>

int main() {
    int choice;
    do {
        std::cout << "\n=== Menu ===" << std::endl;
        std::cout << "1. Add" << std::endl;
        std::cout << "2. Delete" << std::endl;
        std::cout << "3. Display" << std::endl;
        std::cout << "0. Exit" << std::endl;
        std::cout << "Choice: ";
        std::cin >> choice;
        
        switch (choice) {
            case 1: std::cout << "Adding..." << std::endl; break;
            case 2: std::cout << "Deleting..." << std::endl; break;
            case 3: std::cout << "Displaying..." << std::endl; break;
            case 0: std::cout << "Exiting..." << std::endl; break;
            default: std::cout << "Invalid choice!" << std::endl;
        }
    } while (choice != 0);
    
    return 0;
}

四、本章小结

第5章讲解了C++的控制流语句:if/switch条件判断、for/while循环、break/continue控制流、try-catch异常处理。C++11的范围for大大简化了容器遍历。


五、思考与练习

思考题

switch语句为什么需要break?C++17有没有改进?

范围for在什么情况下不能使用?

C++异常处理的开销大吗?什么时候应该用异常?

编程练习

实现一个简单的计算器,支持加减乘除和错误处理。

使用范围for遍历一个二维vector并输出。

实现一个猜数字游戏,使用try-catch处理无效输入。


5/12语句
0%