1、switch内部的变量定义
如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在这个case的块内,从而确保后面的所有case标签都在变量的作用于之外。
case true:
{
//声明语句位于语句块的内部
string file_name=get_file_name();
//...
}
break;
case false:
if(file_name.empty()) //错误:file_name不在作用域内
2、定义在while条件部分或while循环体内的变量每次迭代(即循环)都要经历从创建到销毁的过程。
3、do while语句应该在括号围起来的条件后面用一个分号表示语句结束,这点我一直没有注意到。
对于do while来说,先执行语句或者块(即复合语句),后判断条件,所以不允许在条件部分定义变量。因为如果允许在条件部分定义变量,则变量的使用出现在定义之前,这显然是不合理的。
4、break语句
break负责终止离它最近的while /do while /for /switch语句,并从这些语句之后的第一条语句开始继续执行。
continue语句终止最近循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for /while /do while循环的内部,或嵌套在此类循环里的语句块或块的内部。和break不同的是,只要当switch语句嵌套在迭代语句内部时,才能在switch里使用continue。
5、try语句块和异常处理
(1)throw表达式引发一个异常(也指抛出一个异常),异常检测部分使用throw表达式表示它遇到无法处理的问题,throw关键字后跟的表达式就是抛出的异常类型。
(2)try语句块:将程序中可能出现异常的代码放入try块中。当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch(异常处理代码)块。如果try块中没有语句引发异常,则程序执行完try块中的语句后不执行catch块中的语句,即跳过catch语句,继续执行后面的程序。
每个try语句后面必须伴随一个或多个catch语句,用于捕捉try语句块所产生的异常并作相应的处理。多个catch块 一个catch块只能处理一类异常,当try块中的语句组可能抛出多种异常时,就需要有多个catch块来分别处理各种异常。
如:
try{
int a=args.length;
System.out.println("a=" + a);
int b=42/a;
int c[]={1};
c[42]=99;
}catch(ArithmeticException e){
System.out.println("div by 0:" + e);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("array index oob:" + e);
}
异常安全:表示当抛出异常后,程序能执行正确的行为。
一如往常,try语句块中声明的变量在块外部无法访问,特别在catch子句中也无法访问。
如果一段程序没有try语句块且发生了异常。系统会调用terminate函数并终止当前程序的执行。如果程序包含try语句块,但是最终没有找到匹配的catch子句,程序转到名为terminate的库函数。
6、标准异常
C++定义了一组类用于报告标准库函数遇到的问题,他们分别在以下4个头文件里:
- exception头文件:定义了最通用的异常类exception。只报告异常的发生,不提供任何额外信息
- stdexcept头文件:定义了集中异常,exception /runtime_error /range_error /overflow_error /underflow_error /logic_error /domain_error /invalid_argument /length_error /out_of_range
- new头文件:定义了bad_alloc异常类型
- type_info头文件:定义了bad_cast异常类型