《C++ Primer》第5章 语句

news2024/11/25 16:24:54

参考资料:

  • 《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
else
    statement2

其中,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)

do
    statement
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.coloradmin.cn/o/1071006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nuget 镜像源地址过期,腾旭镜像源地址替换

Nuget过期 国内镜像源地址ssl认证过期了。Nuget无法搜索&#xff0c;一直还原报错 解决方法&#xff0c;替换腾旭镜像源地址 tencent_mirrors https://mirrors.cloud.tencent.com/nuget/

婴幼儿腹泻的原因与应对

引言&#xff1a; 腹泻是婴幼儿常见的健康问题之一&#xff0c;尤其在早期生活阶段&#xff0c;由于他们的消化系统尚未完全发育&#xff0c;容易受到各种因素的影响。腹泻不仅给婴幼儿带来不适&#xff0c;还可能导致脱水和营养不良。因此&#xff0c;了解婴幼儿腹泻的原因是…

【LeetCode刷题笔记】排序

905. 按奇偶排序数组 解题思路&#xff1a; 1&#xff09;额外数组 两次遍历&#xff0c;第一遍将所有的 偶数 放到结果数组 res 的前面&#xff0c;第二遍将所有的 奇数 接着放到结果数组 res 的后面。也可以使用 对撞指针 往结果数组里存&#xff0c;在 一次遍历 内搞定。 2…

Ubuntu20.04 配置 yolov5_ros 功能包记录

文章目录 本文参考自博主源801,结合自己踩坑后修改 项目地址:https://github.com/mats-robotics/yolov5_ros 1.新建工作空间 新建一个工作空间 yolo_ros(名字可自定义),在 yolo_ros 下新建文件夹 src 并catkin_make进行编译 2. 安装相机驱动,可以选用较为主流的 usb_cam 或…

2024年杭州电子科技大学工商管理硕士/工程管理硕士联考网报指南

2024年MBA/MEM考试网上报名流程网报时间根据《2024年全国硕士研究生招生工作管理规定》要求&#xff0c;研招统考网上正式报名时间为2023年10月8日至10月25日&#xff0c;每天9:00—22:00。网上预报名时间为2023年9月24日至9月27日&#xff0c;每天9:00—22:00&#xff08;报名…

S5PV210裸机(四):按键中断

本文主要探讨轮询按键和中断安按键的相关知识。 按键 无按下&#xff0c;GPIO引脚处高电平&#xff0c;电路断开 按下&#xff0c;GPIO引脚接低电平&#xff0c;电路导通 SoC内部通过检测GPIO电平高低判断按键作为SoC的输入信号 按键响应 轮询…

IPETRONIK数据采集设备携手Softing Q-Vision软件致力于ADAS测试方案

一 背景 汽车ADAS技术是当下国内外的重点研究方向&#xff0c;且ADAS的发展水平和市场竞争力紧密相关&#xff0c;因此一套完善的ADAS测试方案对各整车厂而言非常重要。然而&#xff0c;国内ADAS测试却面临着很多阻碍&#xff0c;主要原因在于&#xff1a;相关测试设备昂贵&am…

关于LinkedBlockingQueue的offer的正确用法,如何保证阻塞

我们在做一些并发操作时&#xff0c;常常会使用到LinkedBlockingQueue 也会使用offer方法来往队列中插入数据 我们一直觉得使用offer后&#xff0c;当队列满了&#xff0c;新增加的元素会阻塞插入线程&#xff0c;然后一直等待到队列有空间后再插入。然而测试后发现并不是这样。…

7. Java本项目知识基础---上篇

Java本项目知识快速入门 1. idea项目打开、关闭、复制 正常关闭&#xff1a; 正常打开&#xff1a; 正常复制&#xff1a; 2. idea快捷键 保存&#xff1a;ctrls 撤销&#xff1a;ctrlz 还原&#xff1a;ctrlshiftz 复制:ctrlc 粘贴:ctrlv 快速复制粘贴:ctrld 删除行:c…

MySQL MVCC多版本并发控制机制原理详解

目录 一、前言二、MVCC解决了什么问题三、MVCC核心 Undo Log 和 Read View 介绍3.1、Undo Log&#xff08;日志版本链&#xff09;3.2、Read View&#xff08;一致性视图&#xff09;3.2.1、设计思路3.2.2、ReadView判断规则 四、数据准备五、举例探究MVCC机制5.1、例子执行流程…

直流负载箱的维护和保养方法有哪些?

直流负载箱的维护和保养方法主要包括以下几个方面&#xff1a; 日常要定期清洁负载箱的外壳和散热器&#xff0c;确保散热良好&#xff0c;避免灰尘积累影响散热效果。还要定期检查负载箱的连接器&#xff0c;确保连接良好&#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;换成…

我做了一个简易P图(参数图)分析软件

P图(即参数图&#xff0c;Parameter Diagram)&#xff0c;是一个结构化的工具&#xff0c;帮助大家对产品更好地进行分析。 典型P图格式 P图最好是和FMEA软件联动起来&#xff0c;如国可工软的FMEA软件有P图分析这个功能。 单纯的P图分析软件很少&#xff0c;为了方便做P图分…

vue-1

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 …

检验样品数量

声明 本文是学习GB-T 586-2015 船用法兰铸钢止回阀. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 4 要求 4.1 材料 止回阀的主要零件材料见表4。 表4 止回阀的主要零件材料 零 件 名 称 材 料 名 称 牌 号 标 准 编 号 阀体 阀体 铸钢 ZG275-485…

使用docker-compose部署Redis(单机部署)

目录 一、查看Redis镜像版本二、拉取自己需要的镜像版本三、创建挂载目录四、添加配置文件五、编写 docker-compose.yml 文件六、启动容器七、连接测试 一、查看Redis镜像版本 先去Docker Hub查看Redis镜像有那些版本&#xff0c;我部署的时候Redis最新已经到7.x的版本了&…

23.4 Bootstrap 框架5

1. 背景颜色 1.1 背景颜色样式 在Bootstrap 5中, 可以使用以下类来设置背景颜色: * 1. .bg-primary: 设置为主要的背景颜色(#007bff, 深蓝色). * 2. .bg-secondary: 设置为次要的背景颜色(#6c757d, 灰色). * 3. .bg-success: 设置为成功的背景颜色(#28a745, 绿色). * 4. …

[yolo系列:yolov7添加可变形卷积Deformable Conv V2]

yolo系列文章目录 文章目录 yolo系列文章目录一、可变形卷积是什么&#xff1f;二、使用步骤1.在models/common.py文件添加2.然后再yolo.py里面添加DCNv23.修改yolov7的yaml 总结参考文章 一、可变形卷积是什么&#xff1f; 可变形卷积即DCN&#xff08;缩写取自Deformable Con…

uniapp:swiper-demo效果

单元格轮播 <swiper class"swiper1" :circular"true" :autoplay"true" interval"3000" previous-margin"195rpx" next-margin"195rpx"><swiper-item v-for"(item,index) in 5" :key"inde…

平凡工作也能创造卓越:学习公文写作的逻辑与技巧

平凡工作也能创造卓越&#xff1a;学习公文写作的逻辑与技巧 前言如何把平凡的工作写出光环1.个人不能超越集体2.工作成果的概括要准确3.描写平凡工作的难点痛点 书籍介绍关键点关键词 书籍亮点内容简介购买链接参与方式往期赠书回顾 前言 如何把平凡的工作写出光环 &#x1…