语句
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 | 逻辑错误:使用一个超出有效范围的值 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?