C++Primer笔记-语句

前言

该系列是《C++Primer第五版》的笔记,包含本人认为值得记录和整理的主要的知识点,并不是全部内容,也不是具体的内容。
该系列文章的作用应该是作为复习或预习的参考,有哪些知识点忘记或想学,可以大致浏览下该文章,然后再去书中寻找详细解答。(本系列文章基本是按书本顺序罗列的知识点,便于大家去书中寻找)
所以看该文章前,需要有一定的C++基础,否则阅读起来可能有困难。

本文大致整理了第五章的知识点,属于C++的语法,没有难点,本章后面提及的异常处理,简单了解即可,后续有更详细的介绍。

链接目录

语句块

复合语句(块):用花括号括起来的,一个块就是一个作用域。

语句作用域:块内定义的变量在块外无法访问。关于作用域更详细的阐述,可以在第十八章找到。

条件语句

C++提供了ifswitch两种条件语句。

if语句中的悬垂else:当if语句进行嵌套时,没有用花括号明确匹配,则else与离它最近的尚未匹配的if匹配。

switch语句:

switch(expr){
	case constexpr:
		break;
	default:
		break;
	...
}

先对括号内表达式求值,然后转换成整数类型,对case标签值进行比较匹配(case标签必须是整型常量表达式,可以是布尔值,隐式转换为整型)。

switch内部的控制流:
如果某个case匹配成功,将从该标签开始往后顺序执行所有case分支(无论条件是否满足),除非显示中断。所以大多数情况case块内的结尾应该有一条break语句。除非我们需要多个标签值共享同一组操作,就可以故意省略break语句。

例如:

switch(expr){
	//case0和case1共享同样的操作
	case 0:
	case 1:
		...
		break;
	case 2:
		...
		break;
}

default标签:没有任何一个case标签匹配上,则执行default标签后的语句。

switch内部的变量定义:每个case块为一个作用域。

迭代语句

while语句:表达式为真时执行,如果表达式第一次求值为false,则循环体一次都不执行。(do while不管条件如何都至少执行一次循环体)

传统的for语句:

for(init-statement; condition; expression)
	statement

范围for语句:

for(declaration : expression)
	statement

expression必须是一个序列(数组、vectorstring等类型的对象,这些类型的共同特点是能返回迭代器的beginend成员)。

注意:范围for语句内不能动态添加vector对象的元素,循环在一开始就预存了迭代器end的值,可能影响后续结束及相关条件的判断。

跳转语句

C++有四种跳转语句:breakcontinuegotoreturn

break负责终止离它最近的whiledo whileforswitch语句,并从这些语句之后的第一条语句开始执行。

continue终止最近循环的当且迭代并立即开始下一次迭代,只能出现在forwhiledo while循环的内部。

goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。

label:
	...
goto label;//可以向上也可以向下

//假如有下
label:
	...

try语句块和异常处理

异常处理在第十八章有更详细的介绍。
C++的异常处理包括:

  • throw表达式:throw引发异常,表示遇到无法处理的问题
  • try语句块:一个try语句有一个或多个catch子句,try语句块抛出的异常会被某个catch子句处理
  • 一套异常类,用于在throw表达式和相关catch子句之间传递异常的具体信息

例如:

try{
	...
	//遇到无法处理的问题,抛出异常,并中断后续代码的执行
	throw runtime_error("some message");
	...
}catch(runtime_error e){
	//捕获并处理该异常
	...
}catch(othererror){
	handle-statements
}

一个try语句块可能调用另一个包含try语句块的函数,产生嵌套,则异常抛出时,首先搜索抛出该异常的函数,如果没有匹配,则继续往上寻找(调用该函数的函数)。如果都没匹配,则转到标准库函数terminate,通常就会导致程序非正常退出。

标准异常

标准库异常类:

  • exception:定义在exception头文件中,只报告异常的发生,不提供额外信息
  • stdexcept:定义在stdexcept头文件中,定义了几种常用的异常类
  • bad_alloc:定义在new头文件中
  • bad_cast:定义在type_info头文件中

标准库中定义的具体的错误类型,可以查阅书本(176页),本文不提供。

注意:只能以默认初始化的方式初始化exceptionbad_allocbad_cast对象,不允许提供初始值。其他则必须提供含有错误相关信息的初始值。

异常类型中的what()函数:返回一个指向C风格字符串的const char*,返回内容与异常对象有关,如果异常对象有字符串初始值,则返回,如果没有则由编译器决定。

上一篇 下一篇

评论 | 0条评论