C++ Primer 学习—— 第五章:语句

  |   0 评论   |   0 浏览

1. 简单语句

又分为表达式语句和复合语句,表达式语句以分号结尾,复合语句用花括号括起来的,用于语法上需要一条语句,而逻辑上需要多条语句的情况。复合语句又称为块,一个快是一个作用域,块不以分号结束。

2. 语句作用域

在if,switch,while,for语句内定义的变量只在相应的语句内部可见。

若其他代码也需访问,可将变量定义在外部。

3.switch内部控制流

如果某个case标签匹配成功,将从该标签往后执行所有的case分支,除非程序显式中断这一过程。

注: switch内部定义变量应放在一个块内,确保之后所有的case标签都在变量的作用域之外。用于防止使用未初始化变量的情况。

4.迭代语句

  • while:
while(condition)
    statement

当condition为真,程序便会执行循环体。

  • 传统for语句:
for(init-statement;condition;expression)
    statement

首先执行init-statement, 然后执行condition,若condition为真,执行循环体,最后执行expression, 如果condition为假,跳出循环。

  • 范围for语句:
for(declaration : expression)
    statement

expression 是一个序列,比如用花括号括起来的初始值列表,数组,vector和string类型的对象。

declaration定义了一个表脸,序列中的每个元素都要可以转化成该对象的类型。

  • do while语句:
do
    statement
while(condition);

do while后需要加一个分号表示语句结束。

5.跳转语句

  • break语句:
    break语句负责终止离他最近的switch,for或while,do while。

  • continue语句:
    负责终止迭代并立即开始下一次迭代。

6.try语句块和异常处理

6.1 throw表达式

程序的异常检测部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧跟其后的一个表达式,其中表达式的类型就是抛出的异常类型。

例如:

if(item1.isbn() != item2.isbn()){
  throw runtime_error("Data must refer to same isbn");
}
cout << item1+item2 <<endl;

6.2 try语句块

语法格式:

try{
  program-statements
}catch(exception-declaration){
  handle-statements
}catch(exception-declaration){
  handle-statements
} // ...

例如:

while(cin >> item1 >> item2){
  try{
    if(item1.isbn() != item2.isbn()){
      throw runtime_error("Data must refer to same isbn");
    }
    cout << item1+item2 <<endl;
  }catch(runtime_error err){
    cout<<err.what()
        <<"\nTry again? Enter y or n";
    char c;
    cin >> c;
    if(!cin || c == 'n')
        break;
  }
}

在程序逐层执行的过程中,若抛出异常会从抛出该异常的函数按程序调用顺序从里向外依次寻找catch语句,最终若都没找到,程序转到名为terminate的标准库函数,一般情况下执行该函数将导致系统非正常退出。

6.3 标准异常

C++标准库定义了一组类报告标准库函数遇到的问题。这些异常类可以用在用户编写的程序中,他们分别定义在4个头文件中。

  • exception 头文件包含了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。
  • stdexcpt 头文件定义了几种常用的异常类。
  • new 头文件定义了bad_alloc异常类型。
  • type_info 头文件定义了 bad_cast异常类型。

<stdexcept> 定义的异常类:

  1. exception :最常见的问题 。
  2. runtime_error:只有运行时才能检出得到问题。
  3. range_error:运行时错误,生成的结果超过了有意义的值域范围。
  4. overflow_error:运行时错误,计算上溢。
  5. underflow_error:运行时错误,计算下溢。
  6. logic_error:程序逻辑错误。
  7. domain_error:逻辑错误,参数对应的结果值不存在。
  8. invalid_argument:逻辑错误,无效参数。
  9. out_of_range:逻辑错误,使用一个超出有效范围的值。

6.4 异常的初始化

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

  • 其他异常类型对象应该以一个string或C风格字符串进行初始化。

  • 异常类型提供了一个名为what的成员函数,返回的是一个C风格的字符串(const char*),提供异常的基本信息,如果异常有一个字符串的初始值,what返回该字符串。其他无初始值的异常类型,返回类容由编译器决定。


标题:C++ Primer 学习—— 第五章:语句
作者:YaoCheng8667
地址:https://ycisme.xyz/articles/2019/12/05/1575527328590.html