《C++ Primer》读书笔记 第5章:语句

来源:互联网 发布:富士施乐驱动for mac 编辑:程序博客网 时间:2024/05/17 22:01

前面一些简单的知识点略过

swtich语句

case关键字和它对应的值一起被称为case标签。case标签必须是整形常量表达式,另外要注意的是bool、char、short、枚举类型也算是整形。
switch语句中如果某个case标签匹配成功,将从该标签开始往后执行所有case分支。
每个case语句分支后都应该有break语句,以防止不必要的错误发生。如果是人为省略了break语句,则应该添加注释说明意图。另外每一个switch语句中都应该有default分支,哪怕其什么也不做。

swtich语句内部的变量定义

在switch语句中,如果在某处一个带有初值的变量位于作用域外,而在另一个case语句分支中该变量位于作用域之内,则从前一处跳转到后一处的行为是非法的。c++规定,不允许跨过变量的初始化语句直接跳到该变量作用域的另一个位置。

case true:    string file_name;          //错误:控制流绕过了一个隐式初始化的变量    int val = 0;               //错误:控制流绕过了一个显式初始化的变量    int val;                   //正确:因为val没有进行初始化    break;case false:    val = next_num();    if(file_name.empty())    {    ...    }    break;

一般来说,如果需要为某个case分支语句定义并初始化一个变量,我们应该将变量定义在一个语句块中,从而保证后面的case标签都在变量作用域外。

case true{    string file_name;}break;

goto语句

goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。语法形式如下:

goto label;         //label为一个语句标签

label是用于标识一条语句的标识符。带标签语句是一种特殊的语句,在它之前有一个标识符以及一个冒号:

endreturn;        //一条带标签语句

和switch语句类型,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内,比如

    goto end;    int ix = 10;end:     ix = 42;           //错误,跳过了变量的初始化语句

向后跳过一个已经执行的定义时合法的,跳到变量定义之前意味着系统将销毁该变量,然后重新创建它。

begin:    int sz = get_size();    if(sz < 0)    {        goto begin;     //从作用域内跳到作用域外是合法的    }

在实际编程中应该尽量少使用goto语句,因为这使程序难理解而且不宜修改。

try语句块和异常处理

throw表达式用于抛出异常,try语句块用于捕获异常。throw可以抛出任何类型的对象作为异常。
通常形式如下:

try{    ...    throw err;}catch(err){}

如果一个异常无法被catch捕获,则程序会调用terminate函数终止程序的执行。
标准库中定义几种异常类型以供使用。

原创粉丝点击