语句

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 逻辑错误:使用一个超出有效范围的值
posted @   HeyMeteor  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示