第六章

6.6.5

        对于 switch 结构,只能在它的最后一个 case 标号或 default 标号后面定义变量:

case true:
// error: declaration precedes a case label
string file_name = get_file_name();
break;
case false:

        制定这个规则是为避免出现代码跳过变量的定义和初始化的情况。 如果在两个 case 标号之间定义变量会出现什么情况。该变量会在块结束之前一直存在。对于定义该变量的标号后面的其他 case 标号,它们所关联的代码都可以使用这个变量。如果 switch 从那些后续 case 标号开始执行,那么这个变量可能还未定义就要使用了。 在这种情况下,如果需要为某个特殊的 case 定义变量,则可以引入块语句,在该块语句中定义变量,从而保证这个变量在使用前被定义和初始化。

case true:
{
// ok: declaration statement within a statement block
string file_name = get_file_name();
// ...
}
break;
case false:
// ...

6.9

        任何在循环条件(while)中引用变量都必须在 do 语句之前就已经存在。 因为要到循环语句或者语句块执行之后, 才求解循环条件, 因此 do while 循环不可以采用如下方式定义变量:
// error: declaration statement within do condition is not supported
do {
// ...
mumble(foo);
} while (int foo = get_foo()); // error: declaration in do condition

6.10

        break 语句用于结束最近的 while、do while、for 或 switch 语句 ,并将程序的执行权传递给紧接在被终止语句之后的语句。 break 出现在循环外或者 switch 外将会导致编译时错误。

6.11

        continue 语句导致最近的循环语句的当次迭代提前结束。 continue 语句只能出现在 for、while 或者 do while 循环中,包括嵌套在这些循环内部的块语句中。

6.13

        异常机制提供程序中错误检测与错误处理部分之间的通信。C++ 的异常处理中包括:
        1. throw 表达式, 错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw 引发了异常条件。
        2. try 块,错误处理部分使用它来处理异常。try 语句块以 try 关键字开始,并以一个或多个 catch 子句结束。在 try 块中执行的代码所抛出(throw)的异常, 通常会被其中一个 catch 子句处理。由于它们“处理”异常,catch 子句也称为处理代码。
        3. 由标准库定义的一组 异常类,用来在 throw 和相应的 catch 之间传递有关的错误信息。

        抛出一个异常时,首先要搜索的是抛出异常的函数。如果没有找到匹配的 catch,则终止这个函数的执行,并在调用这个函数的函数中寻找相配的 catch。如果仍然找到相应的处理代码,该函数同样要终止,搜索调用它的函数。如此类推,继续按执行路径回退,直到找到适当类型的 catch 为止。如果不存在处理该异常的 catch 子句,程序的运行就要跳转到名为terminate 的标准库函数 。在程序中出现的异常,如果没有经 try 块定义,则都以相同的方式来处理:毕竟,如果没有任何 try 块,也就没有捕获异常的处理代码(catch 子句)。此时,如果发生了异常,系统将自动调用 terminate 终止程序的执行。 
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页