第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处理无效输入。