YaoCheng8667 的个人博客 YaoCheng8667 的个人博客

记录精彩的程序人生

目录
《C++ Primer 》 第五章:语句
/    

《C++ Primer 》 第五章:语句

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