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

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中&#xff0c;控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。 1. break break语句主要用于在循环或者s…...

决策树中联合概率分布公式解释说明

学习决策树时书本中有一公式 7-3 是&#xff1a; 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实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程&#xff1f;如何使用php email服务&#xff1f; 无论是用户注册、密码重置&#xff0c;还是订单确认&#xff0c;电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能&#xff0c;并提供一些配置技巧&#xff0c;帮助你更好…...

MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路&#xff08;Logo&#xff09;第一步第二步 隐藏Logo示例查看源码及思路&#xff08;Info&#xff09;第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo&#xff0c;今天看了下V9源码&#xff0c;发现M…...

2024年房市

24年8月15日&#xff0c;国家统计局公布&#xff0c;“7月末&#xff0c;商品房待售面积73926万平方米”。(原文链接&#xff1a;https://www.stats.gov.cn/sj/zxfb/202408/t20240815_1955982.html)   7.39亿平方存量商品房&#xff0c;估价均价1万每平&#xff0c;总价约&am…...

index索引

index索引&#xff1a; create index 【1】on 【2】(【3】) 1为索引名&#xff0c;通常为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. 互联网服务提供商&#xff08;ISP&#xff09; 互联网服务提供商&#xff08;ISP&#xff09;是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网&#xff0c;并提供相关的服务&#xff0c;如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…...

基于元神操作系统实现NTFS文件操作(三)

1. 背景 本文主要介绍DBR的读取和解析&#xff0c;并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作&#xff0c;所以只解析了少量的部分&#xff0c;其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...

深度学习与数学归纳法

最近发现&#xff0c;深度学习可以分为两个主要的阶段&#xff0c;分别是前向推理以及反向传播&#xff0c;分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候&#xff0c;本质上是在利用历史数据求网络参数的先验分布&#xff1b; …...

《Linux从小白到高手》理论篇(六):Linux软件安装一篇通

List item 本篇介绍Linux软件安装相关的操作命令&#xff0c;看完本文&#xff0c;有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用&#xff1b;查询功能任何用户都可以操作&#xff1b;如果普通用…...

【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 &#xff08;接上一章&#xff09; 自由协议通信步骤 &#xff08;以MS-A2-1041为例&#xff09; 接收与…...

matlab-对比两张图片的HSV分量的差值并形成直方图

%对比两张图片的HSV分量的差值并形成直方图&#xff0c;改个路径就能用&#xff0c;图片分辨率要一致 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解析部署使用全流程

官网地址&#xff1a; Spring Cloud Gateway 目录 1、SpringGateway简介 1、什么是网关 2、为什么用网关【为了转发】 2、应用&#xff1a; 1.启动nacos 2.创建网关项目 3.网关配置1 4.网关配置2【了解】 5.过滤器配置【了解】 1、SpringGateway简介 核心功能有三个&…...

Solidity 存储和内存管理:深入理解与高效优化

在 Solidity 中&#xff0c;存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取&#xff0c;而这些操作对 gas 的消耗有很大影响。因此&#xff0c;理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…...

机器学习篇-day02-KNN算法实现鸢尾花模型和手写数字识别模型

一. KNN简介 KNN思想 K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;。比如&#xff1a;根据你的“邻居”来推断出你的类别 KNN算法思想&#xff1a;如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别&#xff0c;则该样本也属…...

【C++】STL--vector

1.vector的介绍 我们先来看看vector的文档介绍&#xff0c;实际中我们只要熟悉相关接口就好了。 成员函数 使用STL的三个境界&#xff1a;能用&#xff0c;明理&#xff0c;能扩展 &#xff0c;那么下面学习vector&#xff0c;我们也是按照这个方法去学习 2 vector的使用 v…...

Java使用Redis的详细教程

Redis是一个基于内存的key-value结构数据库&#xff0c;即非关系型数据库&#xff0c;具有高性能、丰富的数据类型、持久化、高可用性和分布式等特点。在Java项目中&#xff0c;Redis通常用于缓存、分布式锁、计数器、消息队列和排行榜等场景。以下是在Java中使用Redis的详细教…...

严重 Zimbra RCE 漏洞遭大规模利用(CVE-2024-45519)

攻击者正在积极利用 CVE-2024-45519&#xff0c;这是一个严重的 Zimbra 漏洞&#xff0c;该漏洞允许他们在易受攻击的安装上执行任意命令。 Proofpoint 的威胁研究人员表示&#xff0c;攻击始于 9 月 28 日&#xff0c;几周前&#xff0c;Zimbra 开发人员发布了针对 CVE-2024-…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...