学会到精通C++:程序流程控制 - 分支与循环 (3/100)
本系列目标:从零基础系统学习C++,逐步深入核心概念与现代特性,最终达到精通水平
当前进度:第三篇 - 掌握程序执行流程的控制(分支与循环结构)
一、流程控制的重要性
程序的世界并非总是线性执行,我们需要根据条件做出决策,或重复执行特定任务。流程控制是编程的核心基础,它让代码具备智能决策和高效处理能力。在本篇中,我们将深入探讨:
- 条件分支语句(if/else, switch)
- 循环结构(while, do-while, for)
- 流程控制关键字(break, continue)
- 嵌套控制结构
二、条件分支:程序决策的艺术
1. if 语句基础
if (condition) {
// 条件为真时执行的代码
}
示例:判断数字正负
int num = -5;
if (num < 0) {
std::cout << num << " 是负数" << std::endl;
}
2. if-else 语句
if (condition) {
// 条件为真时执行
} else {
// 条件为假时执行
}
示例:判断奇偶数
int number = 7;
if (number % 2 == 0) {
std::cout << number << " 是偶数" << std::endl;
} else {
std::cout << number << " 是奇数" << std::endl;
}
3. else-if 链式判断
if (condition1) {
// 条件1为真
} else if (condition2) {
// 条件2为真
} else {
// 所有条件都不满足
}
示例:成绩等级划分
int score = 85;
if (score >= 90) {
std::cout << "成绩等级: A" << std::endl;
} else if (score >= 80) {
std::cout << "成绩等级: B" << std::endl;
} else if (score >= 70) {
std::cout << "成绩等级: C" << std::endl;
} else if (score >= 60) {
std::cout << "成绩等级: D" << std::endl;
} else {
std::cout << "成绩等级: F" << std::endl;
}
4. 三元条件运算符(简洁的条件表达式)
variable = (condition) ? expression_true : expression_false;
示例:
int a = 10, b = 20;
int max = (a > b) ? a : b;
std::cout << "较大的数是: " << max << std::endl;
三、switch 语句:多路分支选择
1. 基本语法结构
switch (expression) {
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
// 更多case...
default:
// 默认代码块
}
2. 工作日判断示例
int day = 3;
switch (day) {
case 1:
std::cout << "星期一" << std::endl;
break;
case 2:
std::cout << "星期二" << std::endl;
break;
case 3:
std::cout << "星期三" << std::endl;
break;
case 4:
std::cout << "星期四" << std::endl;
break;
case 5:
std::cout << "星期五" << std::endl;
break;
case 6:
case 7:
std::cout << "周末" << std::endl;
break;
default:
std::cout << "无效的日期" << std::endl;
}
3. switch 使用要点
- 表达式类型:必须是整型或枚举类型(C++17起支持字符串)
- break的重要性:防止"穿透"执行下一个case
- case合并:多个case共享相同代码块
- default作用:处理未匹配的情况
四、循环结构:重复执行的艺术
1. while 循环
while (condition) {
// 循环体代码
}
示例:计算1到100的和
int sum = 0, i = 1;
while (i <= 100) {
sum += i;
i++;
}
std::cout << "1到100的和为: " << sum << std::endl;
2. do-while 循环
do {
// 循环体代码(至少执行一次)
} while (condition);
示例:用户输入验证
int input;
do {
std::cout << "请输入1-100之间的数字: ";
std::cin >> input;
} while (input < 1 || input > 100);
std::cout << "你输入了有效的数字: " << input << std::endl;
3. for 循环(最常用)
for (initialization; condition; increment) {
// 循环体代码
}
示例:打印乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
std::cout << j << "×" << i << "=" << i*j << "\t";
}
std::cout << std::endl;
}
4. 基于范围的 for 循环(C++11)
for (declaration : range) {
// 循环体代码
}
示例:遍历数组
int numbers[] = {2, 4, 6, 8, 10};
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
五、循环控制关键字
1. break 语句
- 立即终止最内层循环
- 在switch中退出当前case
示例:查找数组中特定元素
int arr[] = {5, 3, 8, 2, 9, 4};
int target = 8;
bool found = false;
for (int i = 0; i < 6; i++) {
if (arr[i] == target) {
found = true;
std::cout << "找到目标值 " << target << " 在索引 " << i << std::endl;
break; // 找到后立即退出循环
}
}
2. continue 语句
- 跳过当前迭代,进入下一次循环
示例:打印1-100的奇数
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
std::cout << i << " ";
}
std::cout << std::endl;
六、综合应用:简易计算器
#include <iostream>
#include <cmath> // 用于数学函数
int main() {
char operation;
double num1, num2;
bool continueCalculation = true;
while (continueCalculation) {
std::cout << "\n简易计算器 (支持 + - * / ^)" << std::endl;
std::cout << "输入第一个数字: ";
std::cin >> num1;
std::cout << "输入运算符 (+, -, *, /, ^): ";
std::cin >> operation;
std::cout << "输入第二个数字: ";
std::cin >> num2;
switch (operation) {
case '+':
std::cout << "结果: " << num1 + num2 << std::endl;
break;
case '-':
std::cout << "结果: " << num1 - num2 << std::endl;
break;
case '*':
std::cout << "结果: " << num1 * num2 << std::endl;
break;
case '/':
if (num2 != 0) {
std::cout << "结果: " << num1 / num2 << std::endl;
} else {
std::cout << "错误:除数不能为零!" << std::endl;
}
break;
case '^':
std::cout << "结果: " << pow(num1, num2) << std::endl;
break;
default:
std::cout << "无效的运算符!" << std::endl;
}
char choice;
std::cout << "继续计算吗? (y/n): ";
std::cin >> choice;
continueCalculation = (choice == 'y' || choice == 'Y');
}
std::cout << "感谢使用计算器!" << std::endl;
return 0;
}
七、常见错误与调试技巧
-
无限循环:忘记更新循环变量
// 错误示例:缺少i++导致无限循环 int i = 0; while (i < 10) { std::cout << i << " "; // 忘记 i++; } -
switch穿透问题:缺少break语句
// 错误示例:缺少break导致穿透 switch (day) { case 1: std::cout << "周一"; case 2: std::cout << "周二"; // 当day=1时会连续输出两个结果 } -
浮点数精度问题:避免使用浮点数作为循环计数器
// 不推荐:浮点数精度问题 for (double d = 0.0; d != 1.0; d += 0.1) { // 可能因精度问题无法精确达到1.0 } -
调试技巧:
- 使用IDE调试器设置断点
- 打印中间变量值
- 简化复杂条件表达式
- 使用大括号明确代码块范围
八、总结与要点回顾
-
分支结构:
if/else if/else:灵活处理各种条件switch:高效处理多路分支- 三元运算符:简洁的条件赋值
-
循环结构:
while:条件前置循环do-while:条件后置循环(至少执行一次)for:精确控制迭代次数- 范围
for:简洁遍历集合
-
控制关键字:
break:立即退出循环continue:跳过当前迭代
-
最佳实践:
- 避免深层嵌套(超过3层应重构)
- 循环条件确保可终止
- 复杂条件拆分为多个变量
- 始终使用大括号{}明确作用域
九、实战练习
-
数字金字塔:
输入:5 输出: 1 121 12321 1234321 123454321 -
质数检测器:
- 判断用户输入的数字是否为质数
- 优化:只需检查到sqrt(n)即可
-
斐波那契数列生成器:
- 输出指定数量的斐波那契数列
- 1, 1, 2, 3, 5, 8, 13…
十、下篇预告:函数深度解析
在下一篇中,我们将深入探索C++函数的强大功能:
- 函数参数传递(值传递 vs 引用传递)
- 函数重载与名称修饰
- 默认参数与内联函数
- 函数模板初探
- 递归函数原理与应用
“编程不是关于你会多少种语言,而是你如何用它们解决问题。”
掌握流程控制,让你的代码具备决策与重复执行的能力,这是构建复杂程序的基石!
今日行动:
- 实现三个实战练习
- 尝试用不同循环结构解决同一问题
- 思考:如何优化嵌套循环的性能?
下一篇:函数深度解析 - 构建模块化程序 (4/100)
11万+

被折叠的 条评论
为什么被折叠?



