C++基础补充(02)C++其他控制语句break continue goto等
文章目录
- 1. break
- 2. continue 语句
- 3. goto 语句
- goto的存在
- 4. 跳出多重循环
- 4.1 goto 直接跳转
- 4.2 C++11及其后版本的 `return` 语句
- 4.3 使用标志变量
在C++中,控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。
1. break
break语句主要用于在循环或者switch语句中中断当前执行的流程,并跳出循环或switch结构。
用法:
- 在switch语句中,从一个case分支中直接跳出 switch,避免执行后续的case分支
- 在循环结构中,立即结束循环,跳出当前所在的循环体。也就是说在一个双重循环(或者更多层嵌套的循环)中使用break,它只能终止内层的循环,而不会终止外层的循环。
例如,跳出 switch 结构
int num = 2;
switch (num) {case 1:cout << "Number is 1" << endl;break; // 跳出switchcase 2:cout << "Number is 2" << endl;break; // 跳出switchcase 3:cout << "Number is 3" << endl;break; // 跳出switch default:cout << "Number is not 1, 2 or 3" << endl;
}
例如,跳出当前循环体
#include <iostream>
using namespace std;
int main()
{int i;for (i = 1; i <= 10; i++) {if (i == 5) {break; //i等于5时,break终止循环,跳出for循环}cout << i << " ";}return 0;
}
// 控制台输出内容为 1 2 3 4
再如,双重循环,代码如下所示。在这个例子中,当 j == 3 时,break语句会终止内层的for循环,但外层的for循环(即 i 的循环)会继续执行
#include <iostream>
using namespace std;
int main() {for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (j == 3) {break; // 只能跳出内层的for循环}cout << "i = " << i << ", j = " << j << endl;}}return 0;
}

2. continue 语句
跳过当前这次循环的剩余代码,立即开始下一次循环,continue不会终止循环
例如:
#include <iostream>
using namespace std;
int main()
{int i;for (i = 1; i <= 10; i++) {if (i == 5) {continue; // 当i等于5时提前结束本次循环,开始下一次循环}cout << i << " ";}return 0;
}
// 控制台输出为 1 2 3 4 6 7 8 9 10
3. goto 语句
- 无条件地从一个地方跳到程序中的另一个任意位置,会降低代码的可读性和可维护性,不建议使用
- 定义一个标签(label),然后通过goto语句跳转到该标签处执行代码
- 标签以冒号:结尾,并放在代码的某一行上
例如:
#include <iostream>
using namespace std;int main()
{int n = 0;
loop_start:cout << "请输入一个数字(输入 0 退出):";cin >> n;if (n != 0){cout << "你输入的是:" << n << endl;goto loop_start;}cout << "GoodBye!" << endl;return 0;
}

goto的存在
尽管不推荐goto语句,但它仍然存在于C++语言中。历史原因,C++来源于C,C从汇编和早期的编程语言中演化而来。早期语言中,goto是实现控制流的主要方式之一。在某些旧的代码库或者嵌入式设备中的固件中,可能大量使用了goto语句,为了兼容性保留,能够维护和扩展,不必重写大量逻辑。
也可以用于跳出嵌套较深的情况。见后面的4. 跳出多重循环。
goto在某些情况下还可以用于处理资源释放或者异常处理,有时候在一些嵌入式系统或者需要高性能的应用中,直接用goto进行异常处理或者资源清理可能会更加简洁。例如:
#include <iostream>
#include <fstream>
using namespace std;int main()
{ifstream file;file.open("example.txt");if (!file.is_open()) {goto error; // 如果文件打开失败,跳到错误处理部分}// 文件操作代码// ...file.close();return 0;error:cout << "Error opening file!" << endl;return 1;
}
在这个例子中,如果文件打开失败,程序会直接跳转到error部分,执行错误处理逻辑。虽然这种方式不如C++中的try-catch异常处理机制规范,但在某些对性能要求极高或资源有限的场合,比如嵌入式开发、驱动程序编写领域等,这种方式提供了一种相对低开销的替代方案,可能会更好。
4. 跳出多重循环
4.1 goto 直接跳转
例如:
#include <iostream>
using namespace std;
int main()
{bool found = false;for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (i * j == 50) {found = true;goto end_loop; // 跳出双重循环}}}end_loop:if (found) {cout << "Found the pair!" << endl;} else {cout << "Pair not found!" << endl;}return 0;
}
4.2 C++11及其后版本的 return 语句
可以使用 return 直接结束函数的执行,函数都结束了,从而循环结束了,也就是说自动跳出所有嵌套的循环。例如
#include <iostream>
using namespace std;
void processLoop()
{int i, j;for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){if (j == 3){return ;//直接结束函数体,从而跳出循环}cout << "i = " << i << ", j = " << j << endl;}}cout << "j==3时,提前退出所有循环" << endl;//不会执行,因为return提前结束了函数体
}
int main()
{processLoop(); //调用函数cout << "循环在 j 为 3 时提前结束" << endl; //控制台输出return 0;
}

这里,如果 return 语句放在了 main 函数中,在 j == 3 时,则会直接结束整个程序的执行。
与前面放在普通函数里有所不同,普通函数因为return结束了自身的执行,还可以返回到主调函数中。
然而,在main函数中,return 则意味着程序完全终止,即程序立即退出。
#include <iostream>
using namespace std;
int main()
{int i, j;for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){if (j == 3){return 0;}cout << "i = " << i << ", j = " << j << endl;}}return 0;
}
4.3 使用标志变量
用标志变量来标记是否需要跳出所有循环,而不是直接使用 return 结束程序。
#include <iostream>
using namespace std;
int main()
{int i, j;bool flag = false; //起到标志作用的变量for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){if (j == 3){flag = true; //设置标志break; //先跳出内层循环}cout << "i = " << i << ", j = " << j << endl;}if (flag) //判断标志{break; //跳出外层循环} }cout << "退出了双重循环" << endl;return 0;
}

相关文章:
C++基础补充(02)C++其他控制语句break continue goto等
文章目录 1. break2. continue 语句3. goto 语句goto的存在 4. 跳出多重循环4.1 goto 直接跳转4.2 C11及其后版本的 return 语句4.3 使用标志变量 在C中,控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。 1. break break语句主要用于在循环或者s…...
决策树中联合概率分布公式解释说明
学习决策树时书本中有一公式 7-3 是: P ( X x i , Y y j ) p i j ( i 1 , 2 , … , m , j 1 , 2 , … , n ) P(X x_i, Y y_j) p_{ij} \quad (i 1, 2, \dots, m, \ j 1, 2, \dots, n) P(Xxi,Yyj)pij(i1,2,…,m, j1,2,…,n) 这个公式表示的是随机变…...
计算机毕业设计 农场投入品运营管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
php email功能实现:详细步骤与配置技巧?
php email发送功能详细教程?如何使用php email服务? 无论是用户注册、密码重置,还是订单确认,电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能,并提供一些配置技巧,帮助你更好…...
MapBox Android版开发 6 关于Logo
MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路(Logo)第一步第二步 隐藏Logo示例查看源码及思路(Info)第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo,今天看了下V9源码,发现M…...
2024年房市
24年8月15日,国家统计局公布,“7月末,商品房待售面积73926万平方米”。(原文链接:https://www.stats.gov.cn/sj/zxfb/202408/t20240815_1955982.html) 7.39亿平方存量商品房,估价均价1万每平,总价约&am…...
index索引
index索引: create index 【1】on 【2】(【3】) 1为索引名,通常为id_表名_列名。2为表名。3为列名。 CREATE INDEX id_account_id ON account(id); -- 根据id创建索引 CREATE INDEX id_account_idname on account(id,name); -- 创建组合索引 索…...
理解互联网链路:从本地ISP到Tier 1 ISP运营商
1. 互联网服务提供商(ISP) 互联网服务提供商(ISP)是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网,并提供相关的服务,如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…...
基于元神操作系统实现NTFS文件操作(三)
1. 背景 本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...
深度学习与数学归纳法
最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布; …...
《Linux从小白到高手》理论篇(六):Linux软件安装一篇通
List item 本篇介绍Linux软件安装相关的操作命令,看完本文,有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用;查询功能任何用户都可以操作;如果普通用…...
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…...
②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器
EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 (接上一章) 自由协议通信步骤 (以MS-A2-1041为例) 接收与…...
matlab-对比两张图片的HSV分量的差值并形成直方图
%对比两张图片的HSV分量的差值并形成直方图,改个路径就能用,图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); HSV1 rgb2ntsc(I1); HSV2 rgb2ntsc(I2); %HSV,HSV 代…...
微服务SpringGateway解析部署使用全流程
官网地址: Spring Cloud Gateway 目录 1、SpringGateway简介 1、什么是网关 2、为什么用网关【为了转发】 2、应用: 1.启动nacos 2.创建网关项目 3.网关配置1 4.网关配置2【了解】 5.过滤器配置【了解】 1、SpringGateway简介 核心功能有三个&…...
Solidity 存储和内存管理:深入理解与高效优化
在 Solidity 中,存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取,而这些操作对 gas 的消耗有很大影响。因此,理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…...
机器学习篇-day02-KNN算法实现鸢尾花模型和手写数字识别模型
一. KNN简介 KNN思想 K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别 KNN算法思想:如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别,则该样本也属…...
【C++】STL--vector
1.vector的介绍 我们先来看看vector的文档介绍,实际中我们只要熟悉相关接口就好了。 成员函数 使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习 2 vector的使用 v…...
Java使用Redis的详细教程
Redis是一个基于内存的key-value结构数据库,即非关系型数据库,具有高性能、丰富的数据类型、持久化、高可用性和分布式等特点。在Java项目中,Redis通常用于缓存、分布式锁、计数器、消息队列和排行榜等场景。以下是在Java中使用Redis的详细教…...
严重 Zimbra RCE 漏洞遭大规模利用(CVE-2024-45519)
攻击者正在积极利用 CVE-2024-45519,这是一个严重的 Zimbra 漏洞,该漏洞允许他们在易受攻击的安装上执行任意命令。 Proofpoint 的威胁研究人员表示,攻击始于 9 月 28 日,几周前,Zimbra 开发人员发布了针对 CVE-2024-…...
C语言结构体定义与自增运算符a++详解
有一个结构体名是stu,它当中包含着5个成员,其中一个成员是name,还有一个成员是num,另外一个成员是age,再有一个成员是group,最后一个成员是score。 除了不能初始化这一点外,结构体成员的定义方式…...
别只盯着协议!用TC8测试案例深度解读车载网络中的ARP与ICMP:安全与稳定的隐藏关卡
车载以太网底层协议实战:从TC8测试案例看ARP与ICMP的安全设计 当一辆现代汽车以100km/h行驶时,其车载网络每秒需要处理超过5000条网络报文。这些报文中的绝大多数,都由ARP和ICMP这样的基础协议承载。在传统IT领域被视为"简单"的协议…...
高效智能转换方案:B站缓存视频一键处理实战指南
高效智能转换方案:B站缓存视频一键处理实战指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在B站视频频繁下架的当下,…...
多任务学习进阶:从MMoE到PLE的模型演进与实战解析
1. 多任务学习基础与核心挑战 多任务学习(Multi-Task Learning, MTL)是机器学习领域的一个重要分支,它让单个模型同时学习多个相关任务。想象一下,你正在教一个学生同时学习数学和物理。如果这两个学科有共同的基础概念࿰…...
Umi-OCR终极指南:3分钟掌握免费离线OCR文字识别
Umi-OCR终极指南:3分钟掌握免费离线OCR文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 …...
pandas API on Spark 与 pandas / PySpark 互转指南
1. 为什么会有互转需求 pandas API on Spark 的定位很特殊:它既想保留 pandas 的使用体验,又建立在 Spark 的分布式执行之上。因此开发时常见的场景有三种: 已经有 pandas 代码,想迁移到分布式环境已经在用 PySpark DataFrame&…...
springboot+vue基于web的网上考试系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分题库管理模块在线考试模块自动阅卷模块技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模…...
从零开始:在Unity中完美实现视频播放功能的完整指南(附常见报错解决方案)
从零开始:在Unity中完美实现视频播放功能的完整指南(附常见报错解决方案) 在游戏开发中,视频播放功能的应用场景越来越广泛——从开场动画、过场剧情到UI背景,视频元素能为玩家带来更丰富的视听体验。Unity作为主流的…...
OpenRouter最新免费额度调整:如何用微信支付宝充值解锁1000次/天API调用
OpenRouter API调用新规解析:微信支付宝充值实战指南 最近OpenRouter平台对免费API调用额度进行了重要调整,这一变化直接影响着国内开发者和AI爱好者的日常使用体验。作为聚合了300多个主流AI模型的统一接口平台,OpenRouter一直以友好的免费政…...
Argos Translate:5分钟掌握开源离线翻译API的全面集成方案
Argos Translate:5分钟掌握开源离线翻译API的全面集成方案 【免费下载链接】argos-translate Open-source offline translation library written in Python 项目地址: https://gitcode.com/GitHub_Trending/ar/argos-translate Argos Translate是一款基于Ope…...
