1. 简单语句
;
表示空语句。
事实上,常用的:
就是用上了空语句。上述例子也可以看出,多出的空语句也并非总是无害的。
复合语句是指用花括号括起来的语句和声明序列,又称为块。
空块为{}
,和空语句等价。
2. 条件语句
else
与离他最近的尚未匹配的if
相匹配。
switch
表达式的计算结果和某个标签相同,程序就从该标签第一条语句开始,直到执行到switch的结尾或者遇到break语句。
可以多个标签执行同样的操作:
在switch内的所有case在不加新的括号的情况下属于同一个作用域。这会导致在定义内部的变量时会出现问题。
C++规定,不能跨过初始化的语句转到另一位置(另一种说法是不能把控制从变量作用域外转移到作用域内,其实是一个意思)。这个较好理解,前面已经初始化了,程序员认为已经初始化了,就可能在下一位置直接使用,而如果允许跨过初始化语句转到另一位置,就会没有初始化而直接使用,造成错误。
而跨过未初始化的语句是可以的,程序员知道该语句未初始化,就能先初始化再使用,不会有问题。
3. 迭代语句
3.1 while语句
3.2 for与范围for
for
语句结构:
可以在init-statement定义多个对象,但是由于init-statement只能有一条声明语句,所以多个对象的类型必须相同。
范围for循环
:
expression表示的必须是一个序列。如:或括号括起来的初始值列表,数组,vector,string等等。
每次循环都会重新定义declaration,并初始化为序列的下一个值。所以一般declaration可以定义为引用,这样不用拷贝序列的元素。如果担心修改了序列的元素,可以声明为常量引用。
事实上,范围for循环等价于:
这就是为什么不能在范围for循环内新增/删除元素,一旦改变了序列长度,迭代器就会失效。
3.3 do-while语句
不允许在while的条件部分定义变量。这样做是为了防止如下情况的发生:
4. 跳转语句
4.1 break
4.2 continue
4.3 goto
goto
语句无条件的跳转到同函数的另一条语句。
goto语句不能从上至下跳过变量的初始化,但是可以从下至上跳过变量的初始化,这样做会销毁该变量并重新初始化。
5. try语句和异常处理
何为异常:
何为异常安全:
5.1 throw表达式
例子:
runtime_error后跟的括号内的字符串是用于初始化runtime_error对象的。
5.2 try语句块
exception-declaration称为异常声明。
示例如下:
也就是说先要初始化runtime-error
对象才能使用what
。try
需接住throw
抛出的异常,然后进入catch
完成异常处理。
比如:
比如在func1中抛出了异常,但是func1没有匹配的catch语句,就会取func中的catch中找。
对于没有try语句块定义的异常,直接terminate,这就是不做任何处理会发生的事情。
上述过程称为栈展开。
执行完catch语句后,会跳转到本try所关联的最后一个catch子句之后的点,从这里开始执行。
catch语句括号内的内容称为异常声明。
5.3 异常类
C++标准库定义了一组类,用于报告标准库函数遇到的问题。
主要分布在4个头文件中:
对于有字符串初始值的异常类型而言,what返回预先定义的字符串,对于无初始值的异常类型而言,what返回的内容由编译器决定。