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

C++ Primer 第5章 语句

C++ Primer 第5章 语句

  • 5.1 简单语句
    • 一、空语句
    • 二、别漏写分号,也别多写分号
    • 三、复合语句(块)
  • 5.2 语句作用域
  • 5.3 条件语句
    • 5.3.1 if语句
      • 一、使用if else语句
      • 二、嵌套if语句
      • 三、注意使用花括号
      • 四、悬垂else
      • 五、使用花括号控制执行路径
    • 5.3.2 switch语句
      • 一、switch内部的控制流
      • 二、漏写break容易引发缺陷
      • 三、default标签
      • 三、switch内部的变量定义
  • 5.4 迭代语句
    • 5.4.1 while语句
      • 一、使用while循环
    • 5.4.2 传统的for语句
      • 一、传统for循环的执行过程
      • 二、for语句头中的多重定义
      • 三、省略for语句头的某些部分
    • 5.4.3 范围for语句
    • 5.4.4 do while语句
  • 5.5 跳转语句
    • 5.5.1 break语句
    • 5.5.2 continue语句
    • 5.5.3 goto语句
  • 5.6 try语句块和异常处理
    • 5.6.1 throw表达式
    • 5.6.2 try语句块
      • 一、编写处理代码
      • 二、函数在寻找处理代码的过程中退出
    • 5.6.3 标准异常
  • 小结

5.1 简单语句

C++语言中的大多数语句都以分号结束,一个表达式,末尾加上分号就变成了表达式语句。表达式语句的作用是执行表达式并丢弃掉求值结果。

一、空语句

; // 空语句
空语句是最简单的语句,空语句由一个单独的分号构成。如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句,空语句什么也不做。

二、别漏写分号,也别多写分号

三、复合语句(块)

复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称作块。块不以分号作为结束。

5.2 语句作用域

while (int i = get_num()) // 每次迭代时创建并初始化icout << i << endl;
i = 0; // 错误:在循环外部无法访问i

5.3 条件语句

5.3.1 if语句

if (condition)statementif (condition)statement
else statement2

一、使用if else语句

二、嵌套if语句

三、注意使用花括号

四、悬垂else

C++规定else与离它最近的尚未匹配的if匹配。

五、使用花括号控制执行路径

5.3.2 switch语句

unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while (cin >> ch) {switch (ch) {case 'a':++aCnt;break;case 'e':++eCnt;break;case 'i':++iCnt;break;case 'o':++oCnt;break;case 'u':++uCnt;break;}
}

switch语句首先对括号里的表达式求值,该表达式紧跟在关键字switch的后面,可以是一个初始化的变量声明。表达式的值转换成整数类型,然后与每个case标签的值比较(case标签必须是整型常量表达式,任何两个case标签的值不能相同)。如果表达式和某个case标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达了switch的结尾或者是遇到一条break语句为止。

一、switch内部的控制流

如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非程序显式地中断了这一过程,否则直到switch的结尾处才会停下来。

unsigned vowelCnt = 0;
switch (ch) {// 出现了a、e、i、o或u中的任意一个都会将vowelCnt的值加1case 'a':case 'e':case 'i':case 'o':case 'u':++vowelCnt;break;
}switch (ch) {// 另一种合法的书写形式case 'a': case 'e': case 'i': case 'o': case 'u':++vowelCnt;break;
}

二、漏写break容易引发缺陷

三、default标签

如果没有任何一个case标签匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。

switch (ch) {// 另一种合法的书写形式case 'a': case 'e': case 'i': case 'o': case 'u':++vowelCnt;break;default:++otherCnt;break;
}

三、switch内部的变量定义

如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。

case true:string file_name; // 错误:控制流绕过一个隐式初始化的变量int ival = 0; // 错误:控制流绕过一个显式初始化的变量int jval; // 正确:因为jval没有初始化break;
case false:jval = next_num(); // 正确:给jval赋一个值if (file_name.empty()) // // ...
 #include <iostream>using namespace std;int main(){bool flag = false;switch (flag){case true:int i = 10; // 报错// 解决方式// (1)加大括号限制i的使用范围// (2)不初始化i,只声明// 定义一个变量——编译阶段就会创建// 初始化一个变量——真正运行时才会创建break;case false:cout << "Hello World" << endl;cout << "&i = " << &i << endl;}return 0;}

如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外。

case true:{// 正确:声明语句位于语句块内部string file_name = get_file_name();}break;
case false:if (file_name.empty()) // 错误:file_name不在作用域之内// ...

5.4 迭代语句

5.4.1 while语句

while的条件部分可以是一个表达式或者是一个带初始化的变量声明
while (condition)statement

一、使用while循环

5.4.2 传统的for语句

for (init-statement; condition; expression)statement
init-statement必须是以下三种形式中的一种:声明语句、表达式语句、空语句

一、传统for循环的执行过程

二、for语句头中的多重定义

init-statement只能有一条声明语句,因此,所有变量的基础类型必须相同。

三、省略for语句头的某些部分

for语句头能省略掉init-statement、condition和expression中的任何一个(或者全部)。

5.4.3 范围for语句

expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或vector或string等类型的对象,这些类型的共同特点是拥有能够返回迭代器的begin和end成员。
for (declaration : expression)statement
vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto &r : v) r *= 2;// 等价于
for (auto begin = v.begin(), end = v.end(); beg != end; ++beg) {auto &r = *beg;r *= 2;
}

不能通过范围for语句增加vector对象(或者其他容器)的元素了。在范围for语句中,预存了end()的值。一旦在序列中添加(删除)元素,end函数的值就可能变得无效了。

5.4.4 do while语句

dostatement
while(condition);
condition使用的变量必须定义在循环体之外

5.5 跳转语句

5.5.1 break语句

break语句负责终止离它最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。

5.5.2 continue语句

continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while、do while循环的内部。

5.5.3 goto语句

goto语句的作用是从goto语句无条件跳转到同一函数的另一条语句。

goto label;
label是用于表示一条语句的标识符
带标签语句是一种特殊的语句,在它之前有一个标示符以及一个冒号:
end: return; // 带标签语句,可以作为goto的目标

goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内。

	goto end;int ix = 10; // 错误:goto语句绕过了一个带初始化的变量定义
end:// 错误:此处的代码需要使用ix,但是goto语句绕过了它的声明ix = 42;

5.6 try语句块和异常处理

异常处理:
(1)throw表达式:异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常
(2)try语句块:异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作异常处理代码
(3)一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。

5.6.1 throw表达式

程序的异常检测部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面通常紧跟一个分号,从而构成一条表达式语句。

Sales_item item1, item2;
if (item1.isbn() != item2.isbn()) {throw runtime_error("Data must refer to same ISBN");// 异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码// 类型runtime_error是标准库异常类型的一种,定义在stdexcept头文件中
}

5.6.2 try语句块

try {program-statements
} catch (exception-declaration) {handler-statements
} catch (exception-declaration) {handler-statements
}catch子句包括三个部分:关键字catch、括号内一个(可能未命名)对象的声明(异常声明)以及一个块

一、编写处理代码

while (cin >> item1 >> item2) {try {// 执行添加两个Sales_item对象的代码// 如果添加失败,代码抛出一个runtime_error异常} catch (runtime_error err) {cout << err.what() << "\nTry again? Enter y or n" << endl;char c;cin >> c;if (!cin || c == 'n') break;}
}

二、函数在寻找处理代码的过程中退出

当异常被抛出时,首先搜索抛出该异常的函数。如果没找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。
如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。

5.6.3 标准异常

(1)exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息
(2)stdexcept头文件定义了几种常用的异常类
在这里插入图片描述
(3)new头文件定义了bad_alloc异常类型
(4)type_info头文件定义了bad_cast异常类型
我们只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初值。其他异常类型的行为则恰好相反:应该使用string对象或C风格字符串初始化这些类型的对象,但是不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该初始值含有错误相关的信息。
异常类型只定义了一个名为what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*。该字符串的目的是提供关于异常的一些文本信息。

小结

C++语言提供了有限的语句类型,它们中的大多数会影响程序的控制流程:
(1)while、for和do while语句,执行迭代操作
(2)if和switch语句,提供条件分支结构
(3)continue语句,终止循环的当前一次迭代
(4)break语句,退出循环或者switch语句
(5)goto语句,将控制权转移到一条带标签的语句
(6)try和catch,将一段可能抛出异常的语句序列括在花括号里构成try语句块。catch子句负责处理代码抛出的异常
(7)throw表达式语句,存在于代码块中,将控制权转移到相关的catch子句
(8)return语句,终止函数的执行
除此之外还有表达式语句和声明语句。表达式语句用于求解表达式。

相关文章:

C++ Primer 第5章 语句

C Primer 第5章 语句 5.1 简单语句一、空语句二、别漏写分号&#xff0c;也别多写分号三、复合语句&#xff08;块&#xff09; 5.2 语句作用域5.3 条件语句5.3.1 if语句一、使用if else语句二、嵌套if语句三、注意使用花括号四、悬垂else五、使用花括号控制执行路径 5.3.2 swi…...

【C++】bitset位图的简单模拟实现及常见面试题

文章目录 前言一、 bitset模拟实现二、 常见面试题1.给你一百亿个整数&#xff0c;找到只出现一次的数字2. 给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 前言 快速查找某个数据是否在一个集合中排序 去重…...

十六、MySql的MVCC机制CONNECT(收官!)

文章目录 一、数据库并发的场景有三种&#xff1a;二、读-写&#xff08;一&#xff09;3个记录隐藏列字段&#xff08;二&#xff09;undo 日志&#xff08;三&#xff09;模拟 MVCC&#xff08;四&#xff09;一些思考&#xff08;五&#xff09;Read View 一、数据库并发的场…...

194、SpringBoot -- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 ht…...

Linux0.11——第二回 从0x7c00到0x90000

上一讲&#xff0c;讲了CPU执行操作系统的最开始的两行代码&#xff1a; mov ax, 0x07c0 mov ds, ax这两行代码将数据段寄存器 ds 的值变成了 0x07c0&#xff0c;方便之后访问内存时&#xff0c;利用这个段基址进行寻址。 接下来的代码&#xff1a; mov ax,0x9000 mov es,ax…...

封装了一个中间放大效果的iOS轮播视图

效果图 计算逻辑 设定在中间展示的size&#xff0c;即正常size&#xff0c;然后设置水平和竖直方向上的margin, 在view的origin和scrollView的contentoffset相等的时候&#xff0c;即 视图处在正中间的时候&#xff0c;最大&#xff0c;然后通过计算其他视图的origin和scrollV…...

趣解设计模式之《小王的糖果售卖机》

〇、小故事 小王最近一直在寻找商机&#xff0c;他发现商场儿童乐园或者中小学校周围&#xff0c;会有很多小朋友喜欢吃糖果&#xff0c;那么他想设计一款糖果售卖机&#xff0c;让后将这些糖果售卖机布置到商场和学校旁边&#xff0c;这样就能获得源源不断的收益了。 想到这里…...

Redis 哨兵模式模式搭建教程

一、介绍 本文实战搭建一主两从三哨兵&#xff0c;通过使用哨兵模式&#xff0c;可以有效避免某台服务器的 Redis 挂掉出现的不可用问题&#xff0c;保障系统的高可用。 本文通过虚拟机搭建的三台 Centos7 服务器进行测试&#xff0c;使用的 Redis 版本为 6.25。 二、准备环…...

41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传

1. 说明 这篇博客主要记录一些在Linux系统中搭建FTP服务器时踩过的一些坑,以及在使用QFtp上传文件时需要注意的问题。 2. FTP环境搭建 在linux系统中,需要安装vsftpd,可以在终端中输入下面的命令进行安装: sudo apt-get install vsftpd使用上述命令安装后,系统中会有一…...

【新版】系统架构设计师 - 案例分析 - 架构设计<架构风格和质量属性>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;架构风格和质量属性&#xff1e;例题1例题2例题3例题4例题5例题6 架构 - 案例分析 - 架构设计&#xff1c;架构风格和质量属性&#xff1e; 例题1 某软件公司为…...

C++ - 红黑树 介绍 和 实现

前言 前面 学习了 AVL树&#xff0c;AVL树虽然在 查找方面始终拥有 O(log N &#xff09;的极高效率&#xff0c;但是&#xff0c;AVL 树在插入 ,删除等等 修改的操作当中非常的麻烦&#xff0c;尤其是 删除操作&#xff0c;在实现当中细节非常多&#xff0c;在实现上非常难掌控…...

【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch判断小球 一、题目要求 编程实现 二、案例分析 1、角色分析...

Spring面试题15:Spring支持几种bean的作用域?singleton、prototype、request的区别是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持几种bean的作用域? Spring支持以下几种Bean的作用域: Singleton(单例):这是Spring默认的作用域。使用@Scope(“singleton”)注解或…...

Spring Boot中Tomcat服务器参数解析及高并发控制

Spring Boot中Tomcat服务器参数解析及高并发控制 Spring Boot 集成了多种服务器&#xff0c;默认使用了Tomcat 服务器。在高并发情况下&#xff0c;合理地配置 Tomcat 服务器参数对于控制请求量和提高系统的稳定性至关重要。本文将解释 Spring Boot 中涉及 Tomcat 服务器的一些…...

Python 运行代码

一、Python运行代码 可以使用三种方式运行Python&#xff0c;如下&#xff1a; 1、交互式 通过命令行窗口进入 Python 并开始在交互式解释器中开始编写 Python 代码 2、命令行脚本 可以把代码放到文件中&#xff0c;通过python 文件名.py命令执行代码&#xff0c;如下&#xff…...

【ROS入门】使用 ROS 话题(Topic)机制实现消息发布与订阅及launch文件的封装

文章结构 任务要求话题模型实现步骤创建工作空间并初始化创建功能包并添加依赖创建发布者代码&#xff08;C&#xff09;创建订阅方代码&#xff08;C&#xff09;配置CMakeLists.txt执行启动roscore编译启动发布和订阅节点 launch封装执行 任务要求 使用 ROS 话题(Topic)机制…...

【企业级SpringBoot单体项目模板 】——Mybatis-plus自动代码生成

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot项目模版、企业级、模版☀️每日 一言&#xff1a;我们之所以这样认为&#xff0c;是因为他们这样说。他们之所以那样说&#xff0c;是因为他们想让我们那样认为。所以实践才是检验真理…...

怒刷LeetCode的第14天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;栈 方法三&#xff1a;双指针 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;线性扫描 方法三&#xff1a;递归 第三题 题目来源 …...

c语言 static

1、静态局部变量在程序加载时初始化&#xff0c;静态局部变量的初始值写入到了data段&#xff1a; 如下代码test_symbol.c int f() {static int x 0;return x; }int g() {static int x 9;return x; }使用命令gcc -c test_symbol.c -o test_symbol 编译 使用命令 readelf -a …...

java基础3

输入一个班学生的成绩&#xff0c;先显示所有及格的成绩&#xff0c;再显示所有不及格的成绩&#xff0c;最后显示及格人数和不及格人数 import java.util.Scanner; public class Hello{public static void main(String [] args) {int SIZE5;double grade[] new double[SIZE]…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...