第五章语句

5.1 简单语句

        末尾加上分号就变成了表达式语句,表达式语句的作用是执行表达式并丢弃掉求值结果。

        空语句

        空语句只有一个单独的分号。使用空语句的时候应该加上注释,从而令读这段代码的人知道该语句是有意省略的。

        别漏写和多写分号

        多余的空语句无害,但是if和while后面的分号可能改变程序员的初衷。

        while(iter != svec.end()) ; //while循环体是那条空语句

        复合语句

        复合语句是指用花括号括起来的语句和声明序列,复合语句也称为块。块不以分号作为结束。

5.2语句作用域

        可以在if、switch、while和for语句控制结构内定义变量,定义在控制结构的变量,只能在相应的语句的内部可见。

5.3条件语句

5.3.1 if 语句

        if语句判断一个指定的条件是否为真,根据判断结果决定是否执行另外一条语句。

        悬垂else

        当一个if语句嵌套在另外一个if语句的内部时,很可能if分支会多余else分支,else与离他最近的尚未匹配的if匹配。

5.3.2switch语句

        switch语句提供了在多个选项中进行选择的便利。

        如果表达式和某个case标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达switch的结尾或者是遇到break语句为止。

        如果switch语句和所有的case都匹配不上,将直接跳到switch结构之后的第一条语句。

        case关键字和它对应的值一起被称为case标签,case标签必须是整形常量表达式,且任何两个case标签的值不能相同。

char ch = getVal();

int val  = 42;

switch(ch){

case 3.14: //错误,不是整数

case val : //错误,不是常量表达式

}

        switch内部的控制流

switch(ch)

{

 case 'a': case 'b':

    ++val

   break;

}

        switch内部的变量定义

        如果程序跳到了某个特定的case,则switch中该case标签之前的部分会忽略掉。

5.4迭代语句

5.4.1 while语句

        while(condition)

             statement;

5.4.2 传统的for语句

        for(init-statement;condition;expression)

        init-statement可以定义多个对象,但只能有一条声明语句

        for(int i=0,j=i;i !=sz; ++i)

5.4.3范围for循环

        范围for语句

        for(declaration:expression)

           statement

        declaration定义一个变量,序列中的每个元素都能转化成该变量的类型,确保类型相容最简单的办法是使用auto类型。

vector<int> v= {0,1,2,3,4,5};

for (auto &r:v)

r*=2;

5.6 try 语句块和异常处理

        异常处理机制为程序中异常检测和异常处理这两部分的协作提供了支持。C++中的异常处理包括:

        1.throw 表达式,异常检测部分使用throw表达式表示它遇到了无法处理的问题,

        2.try语句块,异常处理部分使用try语句块处理异常。try语句块以try开始,并以一个或多个catch子句结束。

        3.一套异常类。用于在throw表达式和catch子句之间传递异常的具体信息。

5.6.1throw表达式

        throw后面紧跟一个表达式。

        throw runtime_error("data not find");

        runtime_error是标准异常库的一种,在stdexcept头文件中。

5.6.2try语句库

try{

} catch(exception-declaration){

}catch(exception-declaration){

}

        try之后跟着一个或多个catch子句,catch子句包含三部分,关键字catch、括号内的对象声明和一个块。

        try中的内容,catch中也无法访问。

        每个标准的异常类都定义了名为what的成员函数。返回c风格字符串。

        如果异常最终没有找到任何catch子句,程序直接跳转到名为terminate的标准库函数。导致程序非正常退出。

5.6.3标准异常

        C++标准库定义了一组类,可以在用户编写的程序中使用,分别定义在4个头文件中。

        1.exception头文件定义了最通用的exception.它只报告异常发生,不提供任何额外的信息。

        2.stdexcept头文件定义了集中常用异常。

        3.new头文件定义了bad_alloc异常类型

        4.type_info头文件定义了bad_cast异常类型。

        stdexcept头文件的异常类型

        exception  最常见的异常

        runtime_error 允许时检测的异常

        overflow_error 运行时错误:计算上溢

        underflow_error 运行时错误:计算下溢

        logic_error 程序逻辑错误

        domain_error 逻辑错误:参数对应的结果值不存在

        invalid_argument  逻辑错误:无效参数

        length_error    逻辑错误:试图创建一个超出该类型最大程度的对象

        out_or_range 逻辑错误:使用是一个超出有效范围的值

        只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值。

        其他异常类型应该使用string或者C风格字符串初始化这些类型的对象,不允许使用默认初始化的方式。

        异常类型只定义了一个what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*.

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值