《C++ Primer》第5章 语句

参考资料:

  • 《C++ Primer》第5版
  • 《C++ Primer 习题集》第5版

5.1 简单语句(P154)

在一个表达式的末尾加上 ; 就构成了表达式语句,其作用是执行表达式并丢弃结果。

空语句

由单独的 ; 构成的语句为空语句。空语句常用于语法上需要一条语句但逻辑上不需要的场景:

while(cin>>a);    // 空语句

使用空语句时应加上注释

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

while(iter != svec.end());    // 有害空语句++iter;

复合语句

复合语句指用 {} 括起来的语句序列,也称作。一个块就是一个作用域。

块不以分号结束

如果语法上需要一条语句,而逻辑上需要多条语句,就需要使用复合语句。例如,whilefor循环体必须是一条语句,所以我们常常使用复合语句。

空块是没有任何语句的 {} ,其作用等价于空语句。

5.2 语句作用域(P155)

可以在 ifswitchwhilefor 语句控制结构内部定义变量,作用域仅限于该条语句

while(int i = get_num()){cout<<i;    // 合法,i在while语句内部有效
}
cout<<i;    // 错误

奇怪了,上述语句的控制结构里也不是语句啊?

5.3 条件语句(P156)

5.3.1 if语句(P156)

if 语句包括两种格式:简单 if 语句和 if else 语句:

// 简单if语句
if(condition)statement// if else语句
if(condition)statement1
elsestatement2

其中,condition 可以是条件表达式,也可以是初始化了的变量声明。

嵌套if语句

悬垂else

如何知道某个 else 和哪个 if 匹配,这个问题称作悬垂 else 。C++ 规定,else离它最近尚未匹配if 语句。

5.3.2 switch语句(P159)

例子:

switch(ch){case 'a':++aCnt;break;case 'e':++eCnt;break;default:++cnt;
}

switch 语句首先对括号里的表达式求值(也可以是初始化的变量声明),表达式的值转化为整数类型,然后与 case 中的每个标签比较,如果和某个 case 匹配成功,则从该标签后的,直到 switch 语句结尾或者遇到 break 语句。如果没有匹配成功,则会执行 switch 语句后的第一条语句。

case 标签必须是整型的常量表达式。

switch内部的控制流

switch(ch){case 'a': case 'e': case 'i': case 'o': case 'u':++cnt;
}

default标签

如果 switch 想以一个空的 default 标签作为结束,则必须在 default 标签后跟上空语句或空块。

switch(ch){case 'a':cout<<'a';default:    // default标签不是必须也在最后cout<<'b';case 'c':cout<<'c';
}

switch内部的变量定义

如果某处一个带有初值的变量位于作用域之,在另一处该变量位于作用于之,则从前一处条跳转到后一处是非法行为,因为 C++ 不允许跨过变量的初始化语句直接跳转到该变量的作用域内。

case true:int i;int j = 0;    // 错误string str;    // 错误,str被隐式初始化了
case false:;

需要注意的是,即使后面并没有用到前面初始化的变量,这种跳转也是不合法的。

5.4 迭代语句(P165)

5.4.1 while语句(P165)

while(condition)statement

condition 不能为空,只要 condition 的求值结果为真,就重复执行循环体。

5.4.2 传统for语句(P166)

for(init-statement;condition;expression)statement

init-statement 必须是声明语句、表达式语句或空语句。

for语句头中的多重定义

init-statement 中可以声明多个对象,但只能有一条声明语句,所以所有对象的类型必须相同

省略for语句头中的某些部分

省略 condition 等价于在条件部分写了一个 true

5.4.3 范围for语句(P168)

for (declaration : expression)statement

expression 必须是一个序列,如用花括号括起来的初始值列表、数组、vector 对象,这些类型的共同特点是有能返回迭代器的 beginend 成员。

declaration 定义一个变量,且每次循环都会重新定义循环控制变量,并将其初始化为序列中的下一个值。

范围 for 语句中预存了序列 end() 的值,如果在循环中添加或删除序列元素,可能会导致 end 函数的值失效。

5.4.4 do while语句(P169)

dostatement
while(condition);

do while 语句允许在 condition 内定义变量,conditon 使用的变量必须定义在循环体之外。

5.5 跳转语句(P170)

5.5.1 break语句(P170)

break 负责终止离它最近的迭代语句和 switch 语句。

5.5.2 continue语句(P171)

continue 语句可以在迭代语句中使用,负责终止当前迭代并立即开始下一次迭代。

5.5.3 goto语句(P172)

goto label;
label: statement

label 是标识一条语句的标识符,可以与程序中的其他实体重名。goto 语句和目标标签的语句必须位于同一个函数之内

5.6 try语句块和异常处理(P172)

当程序某部分检测到一个无法处理的问题时,应该发出某种信号表明程序遇到了故障,然后交由异常处理部分处理。

5.6.1 throw表达式(P173)

throw 表达式能引发一个异常,如:

throw runtime_error("Date must refer to same ISBN");

runtime_error 时标准库异常类型的一种,定义在 stdexcept 头文件中,runtime_error 对象必须初始化,方式是提供 string 对象或者 C 风格字符串。

5.6.2 try语句块

try{program-statements
} catch(exception-declaration){handler-statements
} catch(exception-declaration){handler-statements
}

catch 子句包括三部分:关键字 catch 、括号一个对象的声明、一个块。当某个 catch 子句处理异常后,执行其块,完成后跳转到最后一个 catch 子句的之后的语句执行。

try 语句块组成程序的正常逻辑,其中定义的变量无法在 catch 子句中访问。

int i = 0;
try{cin >> i;if(i <= 0) throw runtime_error("i must be positive");
} catch(runtime_error err){cout << err.what() << endl;
}

what()runtime_error 类的一个成员函数,每个标准库异常类都定义了 what() 成员,这些函数都没有参数,返回值为 C 风格字符串。

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

当异常抛出时,首先检查抛出该异常的函数,如果没找到匹配的 catch 子句,则终止该函数,然后在调用该函数的函数中继续寻找,以此类推。特别地,那些没有包含在 try 语句块中的异常认为在当前函数没有 catch 子句与之匹配。如果最终也没能找到匹配的 catch ,程序将转到名为 terminate 的标准库函数,执行该函数通常会导致程序非正常退出。

5.6.3 标准异常(P176)

C++ 定义了一组类,用于报告程序遇到的问题。

image-20231008195745729

exceptionbad_allocbad_cast 对象只能默认初始化,其他对象则必须提供初始值。

异常类型只定义了一个 what() 成员函数,对于没有初始值的对象,what() 函数的返回值由编译器决定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/151881.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】路由器和交换机的区别

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

6.MySql连接SqlYog

MySql连接SqlYog SqlYog和navicat均是数据可视化工具&#xff0c;熟悉其一即可 SqlYog下载安装 连接&#xff0c;密码和端口号一定要正确&#xff01;&#xff01;&#xff01; 2.保存到数据库 创建数据库&表 创建数据库 创建成功 创建表 点击保存 查看表数据的…

jira 浏览器插件在问题列表页快速编辑问题标题

jira-issueTable-quicker 这是一个可以帮助我们在问题表格页快速编辑问题的浏览器插件 github 地址 功能介绍 jira 不可否认是一个可以帮助有效提高工作效率的工具&#xff0c;但是我们在使用 jira 时使用问题表格可以让我们看到跟多的内容而不用关注细节&#xff0c;但是目…

vulnhub靶场 Kioptrix-level-1

简介&#xff1a; vulnhub是一个提供靶场环境的平台。而Kioptrix-level-1就是一个对新手比较友好的靶场。初学渗透的同学可以做做试试看&#xff0c;项目地址如下。 项目地址&#xff1a;Kioptrix: Level 1 (#1) ~ VulnHub 信息收集 查看本机IP&#xff0c;靶机跟kali都是使用…

常用的分布式ID解决方案原理解析

目录 前言 一&#xff1a;分布式ID的使用场景 二&#xff1a;分布式ID设计的技术指标 三&#xff1a;常见的分布式ID生成策略 3.1 UUID 3.2 数据库生成 3.3 数据库的多主模式 3.4 号段模式 3.5 雪花算法 前言 分布式ID的生成是分布式系统中非常核心的基础性模块&#…

4.方法操作实例变量 对象的行为

4.1 操作对象状态的方法 同一类型的每个对象能够有不同的方法行为&#xff0c;任一类的每个实例都带有相同的方法&#xff0c;但是方法可以根据实例变量的值来表现不同的行为。 play()会播放title值表示的歌曲&#xff0c;调用某个实例的play()可能会播放“Politik”而另一个会…

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

目录 前言 七、指针 7.1 指针与变量 7.1.1 指针类型和指针变量 7.1.2 指针所指变量 7.1.3 空指针、无效指针 7.2 指针操作 7.2.1 指针的算术运算 7.2.2 指针的比较 7.2.3 指针的递增和递减 7.3 指向指针的指针 前言 指针是C语言中一个重要的概念正确灵活运用指针 可…

Android原生实现控件圆角方案(API28及以上)

Android控件的圆角效果的实现方式有很多种&#xff0c;这里介绍一下另一种Android原生的圆角实现方案&#xff08;API28及以上&#xff09;。 我们利用ShapeAppearanceModel、MaterialShapeDrawable来实现一个圆角/切角的Button。 实现效果如下图 我们在为控件添加阴影的基础上…

波奇学C++:用红黑树模拟实现map和set

用同一个树的类模板封装map(key/value)和set(key) 红黑树的Node template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;T _data;Colour _col;RBTreeNode(const T& data):_left(nullptr),_r…

kafka日志文件详解及生产常见问题总结

一、kafka的log日志梳理 日志文件是kafka根目录下的config/server.properties文件&#xff0c;配置log.dirs/usr/local/kafka/kafka-logs&#xff0c;kafka一部分数据包含当前Broker节点的消息数据(在Kafka中称为Log日志)&#xff0c;称为无状态数据&#xff0c;另外一部分存在…

选择适合建筑公司的企业网盘平台

随着城市化进程的加速&#xff0c;越来越多的人开始关注乡村生活品质。Z公司以其标准化产品和优质资源整合&#xff0c;为回乡建房人群提供了一种全新的、高品质的整体解决方案。 Z公司深入调研了10W的回乡建房人群需求&#xff0c;组建了设计、工艺、供应链方面的专家团队&…

【Gradle-10】不可忽视的构建分析

1、前言 构建性能对于生产力至关重要。 随着项目越来越复杂&#xff0c;花费在构建上的时间就越长&#xff0c;开发效率就越低。 通过分析构建过程&#xff0c;可以了解项目构建的时间都花在哪&#xff0c;以及项目存在哪些潜在的问题&#xff0c;找到构建瓶颈&#xff0c;解…

顺序表的简单介绍

目录 前提须知&#xff1a; 数据结构&#xff1a; 什么是数据结构&#xff1f; 数据结构特点&#xff1a; 为什么需要数据结构&#xff1a; 顺序表&#xff1a; 线性表&#xff1a; 与数组区别&#xff1a; 静态顺序表与动态顺序表&#xff1a; 二者之间的区别&#x…

高通camx开源部分简介

camera整体框架 ISP Pipeline diagram Simple Model Camx and chi_cdk 整体框架 CtsVerifier, Camra Formats Topology of Camera Formats. Topology (USECASE: UsecaseVideo) Nodes List Links between nodes Pipeline PreviewVideo Buffer manager Create Destro…

定制自己的 Excel 界面 + 保存 Excel

文章目录 Excel 的界面自定义快速访问工具栏自定义功能区折叠或显示功能区自定义 Excel 的界面保存 Excel Excel 的界面 快速访问工具栏也可以放在功能区下方&#xff1a; 效果&#xff1a; 自定义快速访问工具栏 方法一&#xff1a; S1&#xff1a; S2&#xff1a; 方法二…

(c语言)经典bug

#include<stdio.h> //经典bug int main() { int i 0; int arr[10] {1,2,3,4,5,6,7,8,9,10}; for (i 0; i < 12; i) //越界访问 { arr[i] 0; printf("hehe\n"); } return 0; } 注&#xff1a;输出结果为死循…

geecg-uniapp 源码下载运行 修改端口号 修改tabBar 修改展示数据

APP体验&#xff1a; http://jeecg.com/appIndex技术官网&#xff1a; http://www.jeecg.com安装文档&#xff1a; 快速开始 JeecgBoot 开发文档 看云视频教程&#xff1a; 零基础入门视频官方支持&#xff1a; http://jeecg.com/doc/help 一&#xff0c;下载安装 源码下载…

信创之国产浪潮电脑+统信UOS操作系统体验3:使用 visual studio code搭建Python开发环境

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 老猿原来在windows下开发python程序&#xff0c;要么使用python自带的IDLE&#xff0c;要么使用pycharm&#xff0c;IDLE用来开发很不方便&#xff0c;而pycharm对开发支持比较好&#xff0c;换成…

Angular学习笔记:路由

本文是自己的学习笔记&#xff0c;主要参考资料如下。 - B站《Angular全套实战教程》&#xff0c;达内官方账号制作&#xff0c;https://www.bilibili.com/video/BV1i741157Fj?https://www.bilibili.com/video/BV1R54y1J75g/?p32&vd_sourceab2511a81f5c634b6416d4cc1067…

【Java】微服务——Nacos配置管理(统一配置管理热更新配置共享Nacos集群搭建)

目录 1.统一配置管理1.1.在nacos中添加配置文件1.2.从微服务拉取配置1.3总结 2.配置热更新2.1.方式一2.2.方式二2.3总结 3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的pr…