《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.mzph.cn/news/99754.shtml

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

相关文章

Vue中的router路由的介绍(快速入门)

路由的介绍 文章目录 路由的介绍1、VueRouter的介绍2、VueRouter的使用&#xff08;52&#xff09;2.1、5个基础步骤(固定)2.2、两个核心步骤 3、组件存放的目录&#xff08;组件分类&#xff09; 生活中的路由&#xff1a;设备和ip的映射关系&#xff08;路由器&#xff09; V…

Ceph入门到精通-Nginx超时参数分析设置

nginx中有些超时设置&#xff0c;本文汇总了nginx中几个超时设置 Nginx 中的超时设置包括&#xff1a; “client_body_timeout”&#xff1a;设置客户端向服务器发送请求体的超时时间&#xff0c;单位为秒。 “client_header_timeout”&#xff1a;设置客户端向服务器发送请…

5项先进采购技术,帮助你的企业脱颖而出

持续的改进对保持每个企业的正常运转有着重要作用&#xff0c;采购部门也不例外。 以前&#xff0c;采购团队主要关注两个方面&#xff1a;降低成本和减少风险。随着自动化和云服务的兴起&#xff0c;如今他们还需要关注采购决策的效率、可访问性和可持续性。 技术与采购的融合…

【AI视野·今日Robot 机器人论文速览 第四十八期】Thu, 5 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 5 Oct 2023 Totally 32 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers LanguageMPC: Large Language Models as Decision Makers for Autonomous Driving Authors Hao Sha, Yao Mu, Yuxuan Jiang, Li…

对音频切分成小音频(机器学习用)

我是把so-vits中小工具&#xff0c;分析源码然后提取出来了。以后可以写在自己的程序里。 -------流程&#xff08;这是我做的流程&#xff0c;你可以不用看&#xff09; 从开源代码中快速获取自己需要的东西 如果有界面f12看他里面的接口&#xff0c;然后在源码中全局搜索&…

Stable Diffusion生成图片

画质 masterpiece,best quality,illustration,extremely detail CG unity 8k wallpaper,ultra-detailed,depth of field 杰作&#xff0c;最佳质量&#xff0c;插图&#xff0c;极度详细的8K壁纸&#xff0c;超高详细度&#xff0c;景深 画风 Chinese ink painting,water color…

如何在虚幻引擎中渲染动画?

大家好&#xff0c;今天我将展示如何在虚幻引擎中渲染动画&#xff0c;以及虚幻引擎渲染动画怎么设置的方法步骤。 需要提前了解&#xff1a; 虚幻引擎本地运行慢、渲染慢、本地配置不够&#xff0c;如何解决&#xff1f; 渲云云渲染支持虚幻引擎离线渲染&#xff0c;可批量…

【Python】WebUI自动化—Selenium的下载和安装、基本用法、项目实战(16)

文章目录 一.介绍二.下载安装selenium三.安装浏览器驱动四.QuickStart—自动访问百度五.Selenium基本用法1.定位节点1.1.单个元素定位1.2.多个元素定位 2.控制浏览器2.1.设置浏览器窗口大小、位置2.2.浏览器前进、刷新、后退、关闭3.3.等待3.4.Frame3.5.多窗口3.6.元素定位不到…

一文5000字详解Pytest单元测试,看完不会来打我【保姆级教程】

一、pytest单元测试框架 1.什么是单元测试框架&#xff1f; 单元测试是指在软件开发当中针对软件的最小单位&#xff08;函数、方法&#xff09;进行正确性的检查测试 2.单元测试框架有哪些&#xff1f; Java&#xff1a;junit 和 testing python&#xff1a;unittest 和 …

SI314软硬件兼容替代GTX314L—低功耗14通道电容触摸传感器

Si314是一款具有自动灵敏度校准功能的14通道电容传感器&#xff0c;其工作电压范围为1.8~5.5V。 Si314设置休眠模式来节省功耗&#xff0c;此时&#xff0c;功耗电流为10uA3.3V。 Si314各个感应通道可实现独立使能、校准、灵敏度调节&#xff0c;可以确保可靠性&#xff0c;且具…

linux 安装下载conda并创建虚拟环境

目录 1. 下载安装2. 创建虚拟环境1. 下载安装 在window操作系统中下载anconda包,并通过scp传输到ubuntu操作系统 具体anconda包在如下界面: anconda包 目录 博主选择了最新的包:Anaconda3-2023.09-0-Linux-x86_64.sh 通过scp传输到ubuntu操作系统中: 并在ubuntu操作系…

Linux 安全 - LSM源码分析

文章目录 前言一、简介1.1 DAC 和 MAC1.2 LSM 调用流程图 二、LSM相关数据结构2.1 struct security_hook_list2.2 union security_list_options2.3 structure security_hook_heads 三、security_bprm_check四、LSM 源码分析3.1 early_security_init3.2 security_init3.2.1 secu…

第二证券:市场情绪或逐步修复 十月行情值得期待

第二证券指出&#xff0c;周一A股商场探底回升、小幅轰动收拾&#xff0c;沪指全天底子出现先抑后扬的运转特征。其时上证综指与创业板指数的平均市盈率分别为12.46倍、33.94倍&#xff0c;处于近三年中位数以下水平&#xff0c;商场估值仍然处于较低区域&#xff0c;合适中长期…

华为OD机考B卷 | 100分】阿里巴巴找黄金宝箱(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0~N的箱子&…

【C++设计模式之责任链模式:行为型】分析及示例

简介 责任链模式是一种行为型设计模式&#xff0c;它允许将请求沿着处理链传递&#xff0c;直到有一个处理器能够处理该请求。这种模式将请求的发送者和接收者解耦&#xff0c;同时提供了更高的灵活性和可扩展性。 描述 责任链模式由多个处理器组成一个处理链&#xff0c;每…

香橙派、树莓派、核桃派、鲁班猫安装jupyter notebook【ubuntu、Debian开发板操作类似】

文章目录 前言一、安装环境二、使用方法总结 前言 香橙派树莓派鲁班猫安装一下调试代码还是比较方便的。 一、安装环境 假设已经安装好了miniconda3。如果还没安装可以参考我另外一篇博文&#xff0c;有写怎么安装。 pip install jupyter notebook # 生成Jupyter Notebook的…

算法题:K 次取反后最大化的数组和(典型的贪心算法问题)

这道题没有看题解&#xff0c;直接提交&#xff0c;成绩超越99.5%&#xff0c;说明思路是优的。就是考虑的情况里面弯弯绕比较多&#xff0c;需要考虑全面一点。&#xff08;本题完整题目附在了最后面&#xff09; 具体思路如下&#xff1a; 1、首先排序&#xff0c;然后从最…

智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析

智能合约漏洞&#xff0c;价值 5200 万美元的 Vyper 漏洞攻击原理分析 7 月 30 日&#xff0c;因为 Vyper 部分版本中的漏洞&#xff0c;导致 Curve、JPEG’d 等项目陆续受到攻击&#xff0c;损失总计超过 5200 万美元。 Safful 对此事件第一时间进行了技术分析&#xff0c;并…

2023 IDC中国数字金融论坛丨中电金信向行业分享“源启+应用重构”新范式

9月8日&#xff0c;IDC主办的“2023 IDC中国数字金融论坛”在北京召开。中电金信受邀参会&#xff0c;并带来了深度数字化转型趋势之下关于应用重构的分享与洞见。 论坛重点关注金融科技创新发展趋势与数字化转型之路&#xff0c;中电金信副总经理、研究院院长况文川带来了“创…

nSoftware IPWorks IoT 2022 Java 22.0.8 Crack

物联网库&#xff0c;使用这个轻量级组件库&#xff0c;可以在任何平台上的应用程序中轻松实现物联网 (IoT) 通信协议。 nSoftware IPWorks IoT 最新的 IPWorks IoT 现已推出&#xff01;最新版本的 IPWorks IoT 具有现代化和简化的体验&#xff0c;包括 .NET 中的异步和跨平台…