当前位置: 首页 > ai >正文

《 第三章-招式初成》 C++修炼生涯笔记(基础篇)程序流程结构

C++程序流程结构详解

一、选择结构

选择结构根据条件判断决定程序执行路径。

1. if 语句

语法形式说明执行条件
if (条件) {语句}单分支选择结构条件为真时执行
if (条件) {...} else {...}双分支选择结构条件为真/假分别执行不同语句
if (条件1) {...} else if (条件2) {...} else {...}多分支选择结构按顺序检查条件,执行第一个满足条件的语句块

示例代码

int score = 85;
if (score >= 90) {cout << "优秀" << endl;
} else if (score >= 80) {cout << "良好" << endl;  // 输出此项
} else if (score >= 60) {cout << "及格" << endl;
} else {cout << "不及格" << endl;
}

2. switch 语句

用于多分支选择,适合离散值判断

组件说明
switch (表达式)表达式必须是整型、枚举或字符类型
case 常量:匹配表达式结果的入口点
break;跳出switch结构(防止贯穿)
default:所有case都不匹配时执行的代码块

示例代码

char grade = 'B';
switch (grade) {case 'A': cout << "90-100分" << endl;break;case 'B': cout << "80-89分" << endl;  // 输出此项break;case 'C': cout << "70-79分" << endl;break;default:cout << "不及格" << endl;
}

注意:忘记break会导致"贯穿"现象,程序会继续执行后续case的语句。

二、循环结构

循环结构用于重复执行代码块。

1. while 循环

先判断条件,再执行循环体

语法特点
while (条件) {循环体}循环次数不确定时使用
可能一次都不执行

示例代码

int count = 0;
while (count < 5) {cout << count << " ";  // 输出:0 1 2 3 4count++;
}

2. do-while 循环

先执行一次循环体,再判断条件

语法特点
do {循环体} while (条件);至少执行一次循环体
结尾必须有分号

示例代码

int num = 10;
do {cout << num << " ";  // 输出:10num++;
} while (num < 5);  // 条件不满足但仍执行一次

3. for 循环

最常用的循环结构,包含初始化、条件判断和更新

语法组成部分
for (初始化; 条件; 更新) {循环体}初始化:循环前执行一次
条件:每次迭代前检查
更新:每次迭代后执行

示例代码

for (int i = 0; i < 5; i++) {cout << i << " ";  // 输出:0 1 2 3 4
}// 嵌套循环示例:打印九九乘法表
for (int i = 1; i <= 9; i++) {for (int j = 1; j <= i; j++) {cout << j << "×" << i << "=" << i*j << "\t";}cout << endl;
}

4. 范围-based for 循环 (C++11)

简化容器和数组的遍历

语法适用场景
for (元素类型 变量 : 容器) {循环体}遍历数组、vector、list等容器
只读访问
for (auto& 变量 : 容器) {循环体}可修改容器元素
自动类型推导

示例代码

vector<int> nums = {1, 2, 3, 4, 5};// 只读遍历
for (int num : nums) {cout << num << " ";  // 输出:1 2 3 4 5
}// 修改元素
for (auto& num : nums) {num *= 2;  // 每个元素乘以2
}

三、跳转语句

跳转语句用于改变程序执行流程。

1. break 语句

作用适用场景
终止当前循环while, do-while, for循环内部
跳出switch语句防止case贯穿

示例代码

// 在循环中遇到特定条件退出
for (int i = 0; i < 10; i++) {if (i == 5) {break;  // 当i=5时跳出循环}cout << i << " ";  // 输出:0 1 2 3 4
}

2. continue 语句

作用说明
跳过本次循环剩余代码直接进入下一次循环迭代
不影响循环控制变量更新for循环的"更新"部分仍会执行

示例代码

// 跳过奇数,只输出偶数
for (int i = 0; i < 10; i++) {if (i % 2 != 0) {continue;  // 跳过奇数}cout << i << " ";  // 输出:0 2 4 6 8
}

3. goto 语句

语法注意事项
goto 标签;无条件跳转到标签处
标签:定义跳转目标
慎用!会使程序结构混乱,难以维护

示例代码

int count = 0;START:  // 标签定义
cout << count << " ";
count++;if (count < 5) {goto START;  // 跳转到START标签
}
// 输出:0 1 2 3 4

4. return 语句

作用说明
从函数中退出可返回一个值(非void函数)
结束程序执行main函数中的return结束整个程序

示例代码

int add(int a, int b) {return a + b;  // 返回结果并退出函数
}int main() {int result = add(3, 4);  // result = 7return 0;  // 结束程序
}

四、流程控制综合示例

#include <iostream>
#include <vector>
using namespace std;int main() {// 选择结构示例int age = 25;if (age >= 18) {cout << "成年人" << endl;} else {cout << "未成年人" << endl;}// 循环结构示例vector<int> numbers = {10, 20, 30, 40, 50};int sum = 0;// 使用范围for循环计算总和for (int num : numbers) {sum += num;}cout << "总和: " << sum << endl;  // 输出: 总和: 150// 跳转语句示例cout << "查找第一个3的倍数: ";for (int i = 1; i <= 10; i++) {if (i % 3 == 0) {cout << i << endl;  // 输出: 3break;  // 找到后立即退出循环}}// continue示例: 跳过特定值cout << "1-10中非3的倍数: ";for (int i = 1; i <= 10; i++) {if (i % 3 == 0) {continue;  // 跳过3的倍数}cout << i << " ";  // 输出: 1 2 4 5 7 8 10}cout << endl;return 0;
}

运行结果:

成年人
总和: 150
查找第一个3的倍数: 3
1-10中非3的倍数: 1 2 4 5 7 8 10 

五、最佳实践与注意事项

  1. 选择结构

    • 简单条件用if-else,多离散值用switch
    • switch语句必须有break防止贯穿
    • 避免深层嵌套(超过3层考虑重构)
  2. 循环结构

    • 明确循环次数用for,不确定用while
    • 循环变量作用域最小化(C++99后for循环变量作用域在循环内)
    • 警惕死循环(确保循环条件会变为false)
  3. 跳转语句

    • 优先使用break/continue替代goto
    • break只能跳出一层循环(嵌套循环需使用标志变量)
    • continue不适用于switch语句
  4. 性能考量

    • 循环内避免重复计算(将不变计算提到循环外)
    • 减少循环内部的条件判断
    • 范围for循环比传统for循环更高效(编译器优化)
  5. 可读性建议

    • 复杂条件表达式用括号明确优先级
    • 循环体超过10行考虑提取为函数
    • 避免在循环体内修改循环计数器(for循环的"更新"部分除外)

掌握这些流程控制结构,能够构建逻辑清晰、高效可靠的C++程序,为后续学习面向对象和高级特性打下坚实基础。

http://www.xdnf.cn/news/13994.html

相关文章:

  • 网络原理10 - HTTP完
  • 【Spreadsheet】香港规范结构设计电子表格库开发方案
  • postman Access denied for user‘root‘@‘XXXXXXXX(using password: YES)
  • Flotherm许可管理工具和软件
  • 【强化学习漫谈】4. 从统一视角看 LLM Post-Training
  • 透视黄金窗口:中国有机杂粮的高质量跃迁路径
  • 瑞萨RA-T系列芯片马达类工程TCM加速化设置
  • 爬虫系统异常监控并邮件通知源码
  • 202558读书笔记|《雨季不再来(轻经典)》——日子总有停住的一天,大地要再度绚丽光彩起来
  • 【Create my OS】2 开启中断
  • 魔方在线工具箱 —— 开启便捷高效的在线工具之旅
  • yolov8自训练模型作为预训练权重【增加新类别】新增类别的数据集与旧数据集合并重新训练模型
  • pycharm读取不同格式的数据集用于神经网络模型训练
  • keil下载安装
  • PDF处理控件Aspose.PDF教程: 在 Java 中编辑 PDF 页面大小
  • Mac电脑通过 IntelliJ IDEA 远程连接 MySQL 的详细教程
  • CANoe入门(2)-- 创建一个简单的Panel来改变TX的信号值
  • (2)SpringBoot 3 + Vue 3 前后端分离项目,集成 Flowable
  • 完整强化学习教程:基于4x4网格世界的智能体探索之旅(二)
  • 【深尚想】SM8102ABC 95%高效降压芯片!TWS/物联网专用,2A输出+1.5mm超小体积
  • 中级统计师-经济学基础知识-第二章 企业生产理论
  • Python装饰器详解和默认装饰器
  • 网络流量分析之Heavy hitters和heavy changers
  • Jmeter本身耗资源导致压测不上去解决方案
  • Java中extends与implements深度解析:继承与接口实现的本质区别
  • 【Docker基础】Docker核心概念:仓库(Registry)详解
  • Vue实现悬浮图片弹出大图预览弹窗,弹窗顶部与图片顶部平齐
  • 隧道代理IP的使用与技术优势分析
  • 几种经典排序算法的C++实现
  • jenkins连接git仓库