委员长 发表于 2025-1-2 22:48:39

C++Primer学习笔记05.语句

## 语句

### 作用域

定义在控制结构当中的变量只在相应语句的内部可见,一旦语句结束,变量也就超出其作用范围了

```cpp
while(int i = get_num()) // 每次迭代时创建并初始化 1
    cout<< i <<endl;
i = 0; // 错误,在循环外部无法访问 i
```

### 条件语句

if 语句的使用,不赘述。

switch 语句

```cpp
#include<iostream>

using std::cout;
using std::cin;
using std::endl;
using std::begin;
using std::end;

int main() {
    // switch 统计 a-c 字符出现的个数
    char c;
    int ca = 0;
    int cb = 0;
    int cc = 0;
    while (cin >> c) {
      switch (c) {
            case 'a':
                ca++;
                break;
            case 'b':
                cb++;
                break;
            case 'c':
                cc++;
                break;
            default:
                cout << "over";
      }
    }
    cout << "ca=" << ca;
    cout << "cb=" << cb;
    cout << "cc=" << cc;
}
```

switch 的简写,不要省略 break;

```cpp
switch(ch){
    case 'a': case 'e': case 'i': case 'o':
      ++cnt;
      break;
}
```

<b>switch 内部的变量定义</b>

目前不是很明白书里说的,但是在 switch 内部定义变量的话,建议这样做。

```cpp
case true:
        {
      string file_name = get_file_name();
    }
        break;
case false:
        // some code;
```

### 迭代语句

while 循环、for 循环、 范围 for(Java 的增强 for)、do while

### 跳转语句

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

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

goto:从 goto 语句无条件跳转到同一函数内的另一条语句。不要在程序中使用 goto 语句,因为它使得程序既难理解又难修改,这里也就不记怎么用 goto 了。

#### throw表达式

抛出异常,throw exception_obj;

```cpp
if(a!=b)
    throw runtime_error("a!=b");
cout<<"a=b"<<endl;
```

类型 runtime_error 是标准库异常类型的一种,定义在 stdexcept 头文件中。后面学异常的时候再讨论。

#### try语句块

try 语句块的通用语法形式是

```cpp
try{
    program-statements
}cache(exception-declaration){
    handler-statements
}catch(exception-declaration){
    handler-statements;
}// ...
```

捕获异常的代码

```cpp
#include<iostream>
#include<string>

using std::cout;
using std::cin;
using std::endl;
using std::begin;
using std::end;
using std::string;
using std::runtime_error;

int main() {
    int item1, item2;
    while (cin >> item1 >> item2) {
      try {
            if (item1 != item2) {
                throw runtime_error("item1!=item2");
            }
      } catch (runtime_error err) {
            cout << err.what() << endl;
            char c;
            cin >> c;
            if (c == 'q') {
                cout << "不继续处理了,退出!";
                break;
            }
      }
    }
}
```

#### 标准异常

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

- exception:定义了最通用的异常类 exception。它只报告异常的发生,不提供任何额外信息。
- stdexcept:定义了几种常用的异常类
- new:定义了 bad_alloc 异常类型
- type_info:定义了 bad_cast 异常类型

<div align="center"><h6><stdexcept>定义的异常类</h6></div>


| 异常类型         | 说明                                           |
| ------------------ | ------------------------------------------------ |
| exception      | 最常见的问题                                 |
| runtime_error    | 只有在运行时才能检查出的问题                   |
| range_error      | 运行时错误:生成的结果超出了有意义的值域范围   |
| overflow_error   | 运行时错误:计算上溢                           |
| underflow_error| 运行时错误:计算下溢                           |
| logic_error      | 程序逻辑错误                                 |
| domain_error   | 逻辑错误:参数对应的结果值不存在               |
| invalid_argument | 逻辑错误:无效参数                           |
| length_error   | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
| out_of_range   | 逻辑错误:使用一个超出有效范围的值             |

我们只能以默认初始化的方式初始化 exception、bad_alloc 和 bad_cast 对象,不允许为这些对象提供初始值。
页: [1]
查看完整版本: C++Primer学习笔记05.语句