《C++ Primer》笔记 第5章 语句
- 空块的作用等价于空语句。
- case标签必须是整型常量表达式,default也是一种特殊的case标签。
- 标签不应该孤零零地出现,它后面必须跟上一条语句或者另外一个case标签。
- 如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
case true:
// 因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法
string file_name; // 错误:控制流绕过一个隐式初始化的变量
int ival = 0; // 错误:控制流绕过一个显式初始化的变量
int jval; // 正确:因为jval没有初始化
break;
case false:
// 正确:jval虽然在作用域内,但是它没有被初始化
jval = next_num(); // 正确:给jval赋一个值
if (file_name.empty()) // file_name在作用域内,但是没有被初始化
// ...
- 如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外(变量的作用域在花括号内)。
case true:
{
// 正确:声明语句位于语句块内部
string file_name = get_file_name();
// ...
}
break;
case false:
if (file_name.empty()) // 错误:file_name不在作用域之内
- 定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程(while内定义的变量只在while内有效)。
- 牢记for语句头中定义的对象只在for循环体内可见。
- do-while:作为循环的条件,不能定义在do的内部
- 不要在程序中使用goto语句,因为它使得程序既难理解又难修改。
- 标签标志符独立于变量或其它标志符的名字,因此,标签标志符可以和程序中其他实体的标志符使用同一个名字而不会相互干扰。goto语句和控制权转向的那条带标签的语句必须位于同一个函数之内。
- 和switch语句类似,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内:
// ...
goto end;
int ix = 10; // 错误:goto语句绕过了一个带初始化的变量定义(此处是ix作用域开始的地方)(如果写成`int ix;`正确)
end:
// 错误:此处的代码需要使用ix,但是goto语句绕过了它的声明
ix = 42;
- 向后跳过一个已经执行的定义是合法的。跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它。
// 向后跳过一个带初始化的变量定义是合法的
begin:
int sz = get_size();
if (sz <= 0)
{
goto begin;
}
- throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。例:
throw runtime_error("Data must refer to same ISBN"); - try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作异常处理代码。
- 一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。
- try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问(作用域仅限在该花括号内)。
while (cin >> item1 >> item2)
{
try
{
// 执行添加两个Sales_item对象的代码
// 如果添加失败,代码抛出一个runtime_error异常
}
catch(runtime_error err)
{
// 提醒用户两个ISBN必须一致,询问是否重新输入
cout << err.what();
<< "\nTry Again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break; // 跳出while循环
}
}
- 寻找处理代码的过程与调用链刚好相反。当异常被抛出时,首先搜索抛出该异常的函数。如果没找到匹配的catch子句,终止该函数、并在调用该函数的函数中继续寻找。如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。如果最终还是没能找到任何匹配的catch子句,程序转到名为
terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。对于那些没有任何try语句块定义的异常,也按照类似的方式处理:毕竟,没有try语句块也就意味着没有匹配的catch子句。如果一段程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。 - 异常中断了程序的正常流程。
- 我们只能以默认初始化的方式初始化
exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值。其他异常类型的行为则恰好相反:应该使用string对象或者C风格字符串初始化这些类型的对象,但是不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该初始值含有错误相关的信息。
《C++ Primer》笔记 第5章 语句的更多相关文章
- 《C++ Primer 4th》读书笔记 第6章-语句
原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3912407.html
- C++ Primer 笔记 第三章
C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 ...
- C++ Primer 5th 第5章 语句
和大多数语言一样,C++提供了条件执行语句.重复执行相同代码的循环语句和由于中断当前控制流的跳转语句,表达式语句和声明语句等. 语句有简单语句和复合语句之分.简单语句但多数以分号结束,最简单的语句就是 ...
- 《Pointers On C》读书笔记(第四章 语句)
1.空语句只包含一个分号,它本身并不执行任何任务,其适用的场合是语法要求出现一条完整的语句,但并不需要它执行任何任务. 2.C语言中并不存在专门的“赋值语句”,赋值就是一种操作,在表达式内进行.通过在 ...
- C Primer Plus_第5章_运算符、表达式和语句_编程练习
Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...
- <<C++ Primer>> 第 5 章 语句
术语表 第 5 章 语句 块(block): 包围在花括号内的由 0 条或多条语句组成的序列.块也是一条语句,所以只要是能使用语句的地方,就可以使用块. break语句(break statem ...
- C Primer Plus_第6章_循环_编程练习
1.题略 #include int main(void) { int i; char ch[26]; for (i = 97; i <= (97+25); i++) { ch[i-97] = i ...
- java JDK8 学习笔记——第16章 整合数据库
第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...
- 《SQL CookBook 》笔记-第三章-多表查询
目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...
随机推荐
- zjnu1726 STOGOVI (lca)
Description Mirko is playing with stacks. In the beginning of the game, he has an empty stack denote ...
- Kubernets二进制安装(19)之集群平滑升级
在实际生产环境中,部署好的集群稳定就行了,但是,如果需要使用到新的功能或当前版本出现了严重的漏洞,都建议做升级,本教程是将node节点从v1.15.10版本平滑升级到v1.15.12版本,如果升级到相 ...
- nginx的log、upstream和server
一.log 首先一个log格式化的例子. #配置格式main的log log_format main '$host $status [$time_local] $remote_addr [$time_ ...
- SpringSecurity认证流程
SpringSecurity配置 SecurityConfig.java @Override protected void configure(HttpSecurity http) throws Ex ...
- docker理论题-02
1.什么是namespace? 答:名称空间,作用隔离容器 2.namespace隔离有那些? 答:ipc:共享内存.消息队列 mnt:挂载点 net:网络栈 uts:域,主机名 user:用户,组 ...
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- C# 类 (6) -继承
继承 定义类的时候,public class Dog:Animal 表示 Dog 这个类是 继承自 Animal,冒号后面的是它的基类 继承后 的Dog 类,当调用Dog.Great() 的时候输出的 ...
- shit vuepress docs
shit vuepress docs https://deploy-preview-2764--vuepress.netlify.app/guide/directory-structure.html ...
- Windows 10 Emoji shortcuts
Windows 10 Emoji shortcuts Windows 10 Emoji 快捷方式 https://support.microsoft.com/en-us/windows/windows ...
- JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One
JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One JavaScript 高级程序设计 (第4版) 思维导图下载 JavaScript 高级程序设计 (第4版) 脑图 ...