【c++ Prime 学习笔记】第5章 语句
C++提供了一组控制流语句,包括条件执行语句、循环语句、跳转语句。
5.1 简单语句
空语句
;
,最简单的语句- 别漏写分号,也别多写
while(cin>>s && s!=sought)
; //空语句,加上该注释代表有意为之
//语法上需要,但逻辑上不需要,可使用空语句
while(iter!=svec.end()) ; //空语句为循环体
iter++; //本指令不在循环体类
复合语句
- 复合语句是用花括号{}括起来的语句和声明序列,也称为块。一个块是一个作用域。块中引入的名字只能在块内(包括嵌套于其中的块内)访问。
- 语法上需要一条语句,但逻辑上需要多条语句时使用语句块。如if、for、while的循环体
- 块结尾不需要分号。空块是指内部没有语句的一对花括号
5.2 语句作用域
可在if、switch、while、for的控制结构内定义变量,定义在控制结构中的变量只在相应的语句内部可见。由于这些变量马上要被使用,故必须初始化。
5.3 条件语句
5.3.1 if 语句
- else分支可省略
- if-else语句可嵌套
- 多个if或多个else时的匹配问题(悬垂else):else总与它上面离他最近的尚未匹配的if匹配。
if (condition)
statement
else
statement2
5.3.2 switch 语句
- 在若干固定选项中做选择
switch(statement){
case value1:
statement1
case value2:
statement2
...
}
- switch语句先对括号内表达式求值,表达式的值转为整型后与每个case标签的值比较。如匹配成功,则从匹配处开始顺序执行下面的所有case分支,除非显式中断。
- 为避免执行所有case分支,常用
break
中断switch语句。 - case关键字及其对应值一起称为
case标签
,对应的值必须为整型常量表达式。同一个switch内不能存在相同的case标签。 default
也是一种特殊的case标签,当没有一个case标签能匹配求值语句的值时执行default
switch(ch){
case 'a': case 'e': case 'i': case 'o': case 'u':
++vowelCnt;
break;
}
- C++不允许跨过变量的初始化语句,直接跳转到其作用域的另一个位置。
//程序的流程可能绕开初始化,故该switch语句不合法。
case true:
string file_name; //错,控制流绕过隐式初始化的变量
int ival=0; //错,控制流绕过显式初始化的变量
int jval; //对,jval未初始化
break;
case false:
jval=next_num(); //对,可给jval赋值。它在作用域内但未被初始化
if (file_name.empty()) //file_name在作用域内,但未初始化
...
5.4 迭代语句
迭代语句通常称为循环。while和for在执行前检查条件,do-while在执行后检查条件。
5.4.1 while 语句
while(condition)
statement
5.4.2 传统的for语句
- 可定义多个变量,但只能有一条声明语句,故它们基础类型必须相同。
- init-statement 可定义多个变量,但只能有一条声明语句,故它们基础类型必须相同。
- expression在每次迭代之后执行。
- for语句头可省略init-statement、condition、expression中的一个或全部,但分号不可省略。省略
condition
相当于用true
代替。 - for语句头中定义的名字只在语句头和循环体内可见
for(init-statement; condition; expression)
statement
5.4.3 范围for语句
for(declaration: expression)
statement
- expression必须是序列,如:花括号的初值列表、数组、vector或string等的对象(这些对象都能由begin和end返回迭代器)
- declaration定义一个变量用于访问元素,为确保类型相容经常用auto。如要修改元素,必须声明为引用
- 范围for的定义来源于与之等价的传统for,因此不能在范围for中修改序列的大小(会使迭代器无效)。
vector<int> v={0,1,2,3,4,5,6,7,8,9};
//范围for
for(auto &r:v)
r*=2;
//对应的传统for
for(auto beg=v.begin(), end=v.end(); beg!=end; ++beg){
auto &r=*beg;
r*=2;
}
5.4.4 do-while语句
do
statement
while(condition);
- do-while每次先执行循环体再检查条件。循环体至少执行一次
- 该语句最后有分号标志结束
- condition不能为空
- condition使用的变量必须定义在循环体外
- condition中不能定义变量,否则第一次在循环体中使用时未定义。
5.5 跳转语句
5.5.1 break语句
break终止离它最近的while、do-while、for、switch,从它们之后的第一条开始执行。break只能出现在循环或switch内
5.5.2 continue语句
continue终止最近循环中的当前一次迭代,并开始下一次迭代。只能出现在for、while、do-while内
5.5.3 goto语句
- goto无条件跳转到同一函数内的另一条语句
- goto的目标是
带标签语句
,它是在语句前加一个标签标示符和冒号。由于标签标示符独立于变量或其他标示符的名字,故标签标示符可与其他变量同名,不会干扰 - goto不能用于从变量作用域外跳到作用域内(越过声明语句执行),因为未声明。
- goto可以跳转到已定义的对象的定义之前,这意味着该变量将被销毁并重新创建。
5.6 try 语句块和异常处理
异常
:运行时的反常行为,超出了函数正常功能的范畴异常处理机制包括:
异常检测
和异常处理
异常检测部分使用
throw表达式
表示遇到异常。一般说throw引发(raise)
了异常异常处理部分使用
try语句块
来处理。try语句块以try开始,以一个或多个catch子句
结束。try语句块中抛出的异常将被某个catch子句处理。C++定义了一套
异常类
,用于在throw表达式和相关catch子句间传递异常的具体信息。
5.6.1 throw 表达式
throw表达式包含throw关键字和紧随其后的一个表达式,如
throw statement
,表达式的类型是抛出异常的类型。类型
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子句括号中
exception-declaration
是异常声明
,按照某种异常类型声明该类型的变量,捕获到该类型异常时,为该变量赋值。try中是可能抛出异常的程序,抛出异常后与各catch子句捕获异常的类型对比,并执行匹配的catch子句。
try语句块中声明的变量在块外无法访问,即使是catch中也不行。
hile(cin>>item1>>item2){
try{
if(item1.isbn() != item2.isbn())
//抛出runtime_error类型异常
throw runtime_error("Data must refer to same ISBN");
cout<<item1+item2<<endl;
}
catch(runtime_error err){ //捕获runtime_error类型异常,存储到变量err中
cout<<err.what() //what成员函数得到抛出异常时的信息
<<"\nTry Again? Enter y or n"
<<endl;
char c;
cin>>c;
if(!cin || c=='n')
break;
}
}
- 如果有嵌套的异常处理,即try中可能调用了包含另一个try语句块的函数,则捕获异常顺序与函数调用顺序相反,沿着执行路径回退来找适合的catch
- 如果抛出了异常,且不存在匹配的catch,则程序调用标准库函数
terminate
,该函数使程序非正常退出,其具体行为与系统有关。 - 在异常发生期间能正确执行“清理”工作的程序称为
异常安全
的代码。编写异常安全的代码非常困难,必须清楚异常何时发生,发生后程序如何确保对象有效、资源无泄露、程序处于合理状态,等
5.6.3 标准异常
C++定义了一组异常类,定义在4个头文件中
exception头文件
定义最通用的异常类exception
,它只报告异常的发生,不提供任何信息stdexcept头文件
定义了几种常见异常类,见表5.1new头文件
定义了异常类bad_alloc
type_info头文件
定义了异常类bad_cast
- 标准库异常类只定义了几种运算:创建、拷贝、赋值。
- 对exception、bad_alloc、bad_cast只能使用默认初始化,不可提供初始值。其他异常类相反,不可默认初始化,必须提供string对象或C风格字符串做初值。
- 每个异常类定义了
what方法
,该方法没有参数,返回值是指向C风格字符串的const char *
,该字符串提供异常相关的文本。若该异常类型有字符串初始值,则what返回该字符串,若无初始值,则what返回值由编译器决定。
【c++ Prime 学习笔记】第5章 语句的更多相关文章
- java JDK8 学习笔记——第16章 整合数据库
第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...
- Programming Entity Framework-dbContext 学习笔记第五章
### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...
- The Road to learn React书籍学习笔记(第三章)
The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Stealth视频教程学习笔记(第一章)
Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...
- CSS3秘笈第三版涵盖HTML5学习笔记1~5章
第一部分----CSS基础知识 第1章,CSS需要的HTML HTML越简单,对搜索引擎越友好 div是块级元素,span是行内元素 <section>标签包含一组相关的内容,就像一本书中 ...
- 《DOM Scripting》学习笔记-——第三章 DOM
<Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...
随机推荐
- (1)RabbitMQ在Docker上安装
1.简介 在来学习RabbitMQ时候,我觉得很有必要先把它的环境先搭建起来,这样后面的示例才能进行.因为之前自己手动在Linux服务器上搭建过Elasticsearch,当时踩过太多坑了,浪费太多时 ...
- K8S最小硬件配置
- ElasticSearch集群的安装(windows)
首先尽量保持你的磁盘空间足够大,比如你下载的软件的放在D盘,D盘尽量保持10G以上,还有C盘也差不多10G以上比较保险 一.下载 1)目前我下载的版本是elasticsearch-7.12.0-win ...
- Python - typing 模块 —— Optional
前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...
- SQL Server 使用bcp进行大数据量导出导入
转载:http://www.cnblogs.com/gaizai/archive/2010/04/17/1714389.html SQL Server的导出导入方式有: 在SQL Server中提供了 ...
- 显示锁lock
一.内置锁sync 和 显示锁lock概念 1.synv锁又叫内置锁,不能中断,拿不到无限等待即阻塞: java自带关键字: 隐式可重入: 重入锁:锁对应对象要多次调用对应方法,如递归 2. lock ...
- 恶意软件开发——突破SESSION 0 隔离的远线程注入
一.前言 在Windows XP,Windows Server 2003以及更早的版本中,第一个登录的用户以及Windows的所有服务都运行在Session 0上,这样的做法导致用户使用的应用程序可能 ...
- 机器学习——主成分分析(PCA)
1 前言 PCA(Principal Component Analysis)是一种常用的无监督学习方法,是一种常用的数据分析方法. PCA 通过利用 正交变换 把由 线性相关变量 表示的观测数据转换为 ...
- WebView(网页视图)基本用法
资料来源于菜鸟教程 啊这官方文档居然失效了,打不开.那我们直接就看相关方法: WebChromeClient:辅助WebView处理Javascript的对话框.网站图标.网站title.加载进度等! ...
- PTA 面向对象程序设计 6-3 面积计算器(函数重载)
6-3 面积计算器(函数重载) 实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int ...