语句
C++ Primer 学习笔记:条件、跳转、try/异常处理,只记录不会或不熟悉的地方。
条件语句
if 语句
悬垂else
规定 else 与离他最近的尚未匹配的 if 匹配。
if(grade % 10 >= 3)
if(grade % 10 > 7)
lettergrade += '+';
else // 这个 else 和 if(grade % 10 > 7) 匹配
lettergrade += '-';
switch
case 标签必须是整形常量表达式(或者能转换成整型)。
内部的变量定义
如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则前一处跳转到后一处的行为是非法行为。
case true:
string file_name; // 错误:控制流绕过一个隐式初始化的变量 crosses initialization of 'int ival'
int ival = 0; // 错误:控制流绕过一个显示初始化的变量 crosses initialization of 'std::__cxx11::string file_name'|
int jval; // 正确:jval没有初始化
break;
case false:
jval = next_num(); // 正确:给jval赋值
if(file_name.empty()) // file_name在作用域内,但是没有被初始化
// ...
跳转语句
goto
不要用
和 switch 语句类似,goto 也不能跳过变量的初始化,如果跳回变量定义之前意味着系统销毁该变量,然后重新创建它。
try语句块和异常处理
throw表达式
throw runtime_error("error msg");
runtime_error 是标准库异常类型的一种,定义在 stdexcept 头文件中。
try 语句块
try{
program-statements
} catch (exception-declaration){
handler-statements
} catch (exception-declaration) {
handler-statements
}
使用 err.what() 函数可以得到抛出异常时的 error msg。
如果找不到任何匹配的 catch 子句,程序转到名为 terminate 的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。
标准异常
分别定义在4个头文件中:
- exception 头文件中定义了最通用的异常类 exception。它只报告异常的发生,不提供任何额外的信息
- stdexcept 头文件定义了几种常用的异常类,见下表
- new 头文件定义了 bad_alloc 异常类型
- type_info 头文件定义了 bad_cast 异常类型
| - | - |
|---|---|
| exception | 最常见的问题 |
| runtime_error | 只有在运行时才能检测出的问题 |
| range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
| overflow_error | 运行时错误:计算上溢 |
| underflow_error | 运行时错误:计算下溢 |
| logic_error | 程序逻辑错误 |
| domain_error | 逻辑错误:参数对应的结果值不存在 |
| invalid_argument | 逻辑错误:无效参数 |
| length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
| out_of_range | 逻辑错误:使用一个超出有效范围的值 |
浙公网安备 33010602011771号