文档章节

C++ Primer 学习笔记(第五章:语句)

S
 ShawnLue
发布于 2015/08/20 16:21
字数 1086
阅读 51
收藏 3

##C++ Primer 学习笔记(第五章:语句)


[TOC]


###5.1 简单语句

  1. 空块的作用等价于空语句。

###5.2 语句作用域


###5.3 条件语句

  1. 悬垂else:else只与离他最近的尚未匹配的if匹配。

  2. switch语句:switch括号里的表达式的值必须能转换成整数类型,然后与每个case里的标签值比较。case标签也必须是整形的常量表达式,且任意两个标签值不能相同。

char ch = getVal();
int ival = 42;
switch (ch){
	 case 3.14://错误:case标签不是一个整数
	 case ival://错误:case标签不是一个常量
}

switch语句中如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支(注意不再有匹配标签的限制,而是完全执行),除非程序显式地中断(break)。而如果希望两个或更多个值共享同一组操作时,就会故意省略掉break语句,使得程序能够连续执行若干个case标签。例如:

unsigned vowelCnt = 0;
//...
switch (ch){
	 case 'a':
	 case 'e':
	 case 'i':
	 case 'o':
	 case 'u'://以上五个标签也可以写在一行里
		 ++vowelCnt;
		 break;
}
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while (cin >> ch)
	 switch (ch) {
		 case 'a':
        case 'A':
	         ++aCnt;
            break;
        case 'e':
        case 'E':
            ++eCnt;
            break;
        case 'i':
        case 'I':
            ++iCnt;
            break;
        case 'o':
        case 'O':
            ++oCnt;
            break;
        case 'u':
        case 'U':
            ++uCnt;
            break;
   }

###5.4 迭代语句

  1. 当不确定要迭代多少次,或者在循环结束后需要访问控制变量时,使用while循环比较合适。

  2. for语句中定义的对象只在for循环体内可见。

for (init-statement; condition; expression)
	 statement
  1. init-statement可以定义多个对象,但是只能有一条声明语句。因此所有变量的基础类型必须相同。

  2. for语句可以省略掉任意一个部分:

auto beg = v.begin();
for (; beg != v.end() && *beg >= 0; ++beg)
	 ;
for (int i = 0; ; ++i)
	 //对i处理,内部代码负责终止过程
vector<int> v;
for (int i; cin >> i; )
	 v.push_back(i);//
  1. 范围for语句
for (declaration : expression)
	 statement

expression必须是一个序列,包括:花括号括起来的初始值表、数组或者vectorstring等类型对象,它们的共同点是可以返回迭代器的beginend成员。所以不能通过范围for语句来增加容器的元素。

  1. do while语句中不允许在条件中定义对象。注意while后面有;
do{
//...
}while(/*...*/);

###5.5 跳转语句

  1. break语句的作用范围仅限于最近的循环或者switch

  2. continue语句终止最近的循环(forwhiledo while)中的当前迭代,并立即开始下一次迭代。


###5.6 try语句块和异常处理

  1. throw表达式:表达遇到了无法处理的问题。
throw runtime_error("..."); 
  1. try语句块:抛出异常。
try{
	 program-statements//程序的正常逻辑
}catch (exception-declaration){//异常声明
	 handler-statements
}catch (exception-declaration){
	 handler-statements
}//...

注意try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问。

  1. 当异常被抛出时,首先搜索抛出该异常的函数。如果没找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找,以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。 如果还是没有找到任何匹配的catch子句,程序将转到名为terminate的标准库函数,而执行该函数将导致程序非正常退出。对于没有任何try语句块定义的异常,也将按照这种方式处理。

  2. C++标准异常定义在4个头文件中: exception定义了最通用的异常类exception,只报告异常的发生,不提供额外信息。 stdexcept定义了几种常用的异常类,如runtime_errorrange_error等。 new头文件定义了bad_alloc异常类型。(12章) type_info头文件定义了bad_cast异常类型。(19章)

  3. 异常类型只定义了一个名为what的成员函数,返回值是一个C风格字符串常量,用于提供一些异常的文本信息。

int a, b;
	cout << "Input:" << endl;
	while (cin >> a >> b){
		try{
			if (b == 0)
				throw runtime_error("divisor is 0");
			cout << static_cast<double>(a) / b << endl;
			break;
		}catch (runtime_error err){
			cout << err.what() << endl;
			cout << "Try again" << endl;
			cout << "Input:" << endl;
		}
	}

© 著作权归作者所有

S
粉丝 1
博文 5
码字总数 14180
作品 0
海淀
程序员
私信 提问
《C++ primer》读后感:时代的经典

说起Lippman的C++ Primer,我总是有种特殊感情。这本书既是我进入C++领域的敲门砖,也是我第一次在网络上发表技术文章的对象。当年读书笔记中的青涩迷惘和年少轻狂都还历历在目,转眼已经从第...

凌杰_owlman
2018/05/15
0
0
C++ primer第二次阅读学习笔记(第1、2章)

C++ primer第二次阅读学习笔记(第1、2章) 一年前开始了C++primer的第一遍阅读,一年之后重新拾起C++primer。原因有二,一:第一遍阅读时刚开始接触C++,对C++认识有限,学习C++primer不可能...

长平狐
2012/10/08
107
0
【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: happylifemxy@qq.com 大家别叫我楼主可以吗- -.请叫我...

长平狐
2012/11/12
181
0
【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: happylifemxy@qq.com 大家别叫我楼主可以吗- -.请叫我...

长平狐
2012/11/12
121
0
转让c++ Linux好书

转让几本书书,家里书太多了,占位置: 1、 c++ primer 第四版中文版 http://book.douban.com/subject/1767741/ 2、c++ primer 第五版英文版 http://book.douban.com/subject/24089577/ 3、计...

zhoutianzuo
2014/03/14
515
4

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
50分钟前
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部