复合语句:符合语句是用花括号{}括起来的代码块,包含语句、声明等,一个块是一个作用域,在块内引入的变量名字只能在当前块内(包括块内嵌套的块)生效。
条件语句
if else
略
switch...case...
switch(statement){
case value1:
statement1
case value2:
statement2
...
}
- switch语句先对括号内表达式求值,表达式的值转为整型后与每个case标签的值比较。如匹配成功,则从匹配处开始顺序执行下面的所有case分支,除非
显式中断。 - 为避免执行所有case分支,常用
break中断switch语句。 - case关键字及其对应值一起称为case标签,对应的值必须为整型常量表达式。同一个switch内
不能存在相同的case标签。 default也是一种特殊的case标签,当没有一个case标签能匹配求值语句的值时执行default
迭代语句
while
略
for
for(init-statement; condition; expression)
statement
- 传统for语句
- init-statement必须是声明语句、表达式语句、空语句中的一种,它只在循环开始时执行一次,不会重复执行。
- init-statement可定义多个变量,但只能有一条声明语句,故它们基础类型必须相同。
- expression在每次迭代之后执行。
- for语句头
可省略init-statement、condition、expression中的一个或全部,但分号不可省略。省略condition相当于用true代替。 - for语句头中定义的名字只在语句头和循环体内可见
for(declaration: expression)
statement
- 范围for语句
- expression必须是
序列,如:花括号的初值列表、数组、vector或string等的对象(这些对象都能由begin和end返回迭代器) - declaration定义一个变量用于访问元素,为确保类型相容经常用auto。如要修改元素,必须声明为
引用 - 每次迭代时都会重新定义循环变量,然后再执行statement
- 范围for的定义来源于与之等价的传统for,因此不能在范围for中修改序列的大小(会使迭代器无效)。
跳转语句
break、continue、goto、return
- goto不能用于从变量作用域外跳到作用域内(越过声明语句执行),因为未声明。
- goto可以跳转到已定义的对象的定义之前,这意味着该变量将被销毁并重新创建。
try语句块和异常处理
异常:运行时的反常行为,超出了函数正常功能的范畴- 异常处理机制包括:异常检测和异常处理
- 异常检测部分使用throw表达式表示遇到异常。一般说
throw引发(raise)了异常 - 异常处理部分使用
try语句块来处理。try语句块以try开始,以一个或多个catch子句结束。try语句块中抛出的异常将被某个catch子句处理。 - C++定义了一套异常类,用于在
throw表达式和相关catch子句间传递异常的具体信息。
throw表达式
- throw表达式包含throw关键字和紧随其后的一个表达式,如
throw statement,表达式的类型是抛出异常的类型。 - 类型
runtime_error是异常类的一种,定义于stdexcept头文件中。runtime_error必须由一个string对象或C风格字符串来初始化。
try语句块
- catch子句括号中是
异常声明,按照某种异常类型声明该类型的变量,捕获到该类型异常时,为该变量赋值。 - try中是可能抛出异常的程序,抛出异常后与各catch子句捕获异常的类型对比,并执行匹配的catch子句。
- try语句块中声明的变量在
块外无法访问,即使是catch中也不行。 例子:抛出并处理异常
while(cin>>item1>>item2){
try{
if(item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN"); //抛出runtime_error类型异常
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;
}
}
标准异常
- C++定义了一组异常类,定义在4个头文件中
exception头文件定义最通用的异常类exception,它只报告异常的发生,不提供任何信息stdexcept头文件定义了几种常见异常类,见表5.1new头文件定义了异常类bad_alloctype_info头文件定义了异常类bad_cast
- 标准库异常类只定义了几种运算:创建、拷贝、赋值。
- 对
exception、bad_alloc、bad_cast只能使用默认初始化,不可提供初始值。其他异常类相反,不可默认初始化,必须提供string对象或C风格字符串做初值。 - 每个异常类定义了what方法,该方法没有参数,返回值是指向C风格字符串的
const char *,该字符串提供异常相关的文本。若该异常类型有字符串初始值,则what返回该字符串,若无初始值,则what返回值由编译器决定。