C++ Primer阅读笔记--语句的使用

① 空语句

        最简单的语句是空语句,其只含有一个单独的分号;

② switch语句

        case 关键字和它对应的值一起被称为 case 标签,case 标签必须是整型常量表达式;

char ch = getVal();
int iVal = 42;
switch(ch){
    case 3.14: // 错误,case标签不是一个整数
    case ival: // 错误,case标签不是一个常量
    ……
}

③ 范围 for 语句

        C++11 新标准引入了范围 for 语句,其可以遍历容器或其它序列的所有元素;

       expression 表示的必须是一个序列,其可以为用花括号括起来的初始化列表、数组、或 vector 和 string 等类型的对象,这些对象的特点是拥有能返回迭代器的 begin 和 end 成员;

        declaration 定义一个变量,序列中的每个元素都得能转换成该变量的类型,一般使用 auto 类型说明符声明变量;如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型;

for (declaration : expression)
    statement

std::vector<int> v = {0, 1, 2, 3};
for (auto &r : v)
    r *= 2; // 将 v 中所有元素翻倍
// 范围 for 语句与以下传统 for 语句等价
for(auto beg = v.begin(), end = v.end(); beg != end; ++beg){
    auto &r = *beg;
    r *=2;
}
// 因此不能通过范围 for 语句增加 vector 对象的元素,因为范围 for 语句预存了 end() 的值;

④ break 语句和 continue 语句

        break 语句负责终止离它最近的while、do while、for 和 switch 语句,并从这些语句之后的第一条语句开始继续执行;

        continue 语句终止最近的循环中的当前迭代并立即开始下一次迭代,其只能出现在 for、while、do while或嵌套在此类循环里的语句或块的内部;

        break 语句的作用范围仅限于最近的循环或者 switch;出现在嵌套循环中的 continue 语句也仅作用于离它最近的循环;与 break 语句不同的是,只有当 switch 语句嵌套在迭代语句内部时,才能在 switch 里使用 continue 语句;

⑤ goto语句

        goto 语句的作用是从 goto 语句无条件地跳转到同一函数内的另一条语句;一般不建议在程序中使用 goto 语句,因为其能使程序变得难以理解和修改;

goto label;

// label 是用于标识一条语句的标示符,其定义的带标签语句如下:
label : xxxxx;    // xxxx为具体的语句

        goto 语句不能跳过带有初始化变量定义的语句,即下面的代码会出错,因为 goto 语句跳过了 int a = 30 这条带有初始化定义的语句;

// 错误代码如下:
#include "iostream"

int main(int argc, char* argv[]){
    goto label;
    int a = 30;
    std::cout << "a: " << a << std::endl;
    label :
        int b = 50;
        std::cout << "b: " << b << std::endl;

    return 0;
}

// 正确代码如下:
#include "iostream"

int main(int argc, char* argv[]){
    int a = 30;
    goto label;
    std::cout << "a: " << a << std::endl;
    label :
        int b = 50;
        std::cout << "b: " << b << std::endl;

    return 0;
}

⑥ 异常处理机制

        异常处理机制为程序中的异常检测和异常处理这两部分的协作提供支持;在 C++ 语言中,异常处理包括:throw表达式、try语句块和异常类;

        throw 表达式:异常检测部分使用 throw 表达式来表示其遇到的无法处理的问题,一般称为 throw 引发(raise)了异常;

        try 语句块:异常处理部分使用 try 语句块处理异常,其以关键字 try 开始,并以一个或多个 catch 子句结束;try语句块中抛出的异常通常会被某个 catch 子句处理,因此 catch 子句被称为异常处理代码;

        异常类:用于在 throw 表达式和相关的 catch 子句之间传递异常的具体信息;

        throw 表达式包含关键字 throw 和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型;

        抛出异常将终止当前函数,并把控制权转移给能处理该异常的代码;

// 当数据的 ISBN 不相同时,抛出一个 runtime_error 类型的异常对象
if(item1.isbn() != item2.isbn()){
    throw runtime_error("DATA must refer to same ISBN");
}

        try 语句块的通用语法形式如下,即由一个 try 块和一个或多个 catch 子句块组成; catch 子句包括三部分:关键字 catch、括号内一个对象的声明(称为异常声明)、一个块;

        当选中某个 catch 子句处理异常时,会执行与之对应的块;catch 一旦完成,程序跳转到 try 语句块最后一个 catch 子句之后的语句继续执行;

try{
    program-statements
} catch (exception-declaration){
    handler-statements
} catch (exception-declaration){
    handler-statements
}
// 代码实例
#include <iostream>
#include <stdexcept>

int main(int argc, char* argv[]){
    int color;
    std::cin >> color;
    std::cout << "your input is : " << color << std::endl;
    try{
        if (color > 255){
            // 抛出上溢错误
            throw std::overflow_error("上溢"); 
        } 
        else if(color < 0){
            // 抛出下溢错误
            throw std::underflow_error("下溢");
        }
    }
    // 捕获std::overflow_error的错误
    catch(std::overflow_error err1){ 
        color = 255;
    }
    // 捕获std::underflow_error的错误
    catch(std::underflow_error err2){ 
        color = 0;
    }
    std::cout << "Real valid data: " << color << std::endl;

    return 0;
}

         上述代码中,根据不同检测条件抛出了不同的异常,并由对应的 catch 语句进行处理;抛出的异常类型可以采用提供的标准异常,也可以自定义异常类型,上述代码中使用了由头文件 stdexcept 提供的两个标准异常类:std::overflow_error 和 std::underflow_error;

        当异常被抛出时,会搜索能够处理该异常的函数;当未能找到任何匹配的 catch 子句时,程序会调用 terminate 函数来中止程序;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值