C++Primer第五版学习笔记 第二章
第五章 语句
(没啥内容这一章 -。-)
if_else 语句
- 悬垂else:当if的个数超过else,规定else与离它最近的尚未匹配的if相互匹配。
### switch 语句
switch(ch){
case 'a': //case的值只能是字面值或常量表达式
case 'A':
a_num++;
break;
// ...
default:; // 可以为空,但是要有
}
范围 for 语句
int x[] {1,2,3,4,5,6,7};
for(auto &i : x){
i += 1; //修改变量必须使用引用符号&
//此外,for语句中不允许增加或减少vector和其他容器的长度,因为for语句预存了end()的值作为结束标志,一旦修改长度,end()可能会失效。
}
do-while 语句
do{
;
}while(); //注意末尾的分号
goto 语句
int x = 0;
begin: x = 1;
if(x==0){
goto begin;
}
try-catch 语句
- 常见异常exception
标准库异常类<stdexcept> | 描述 |
---|---|
runtime_error | 运行时才能检测出的问题 |
range_error | 生成的结果超出了有意义的值域范围 |
overflow_error | 计算上溢 |
underflow_error | 计算下溢 |
logic_error | 程序逻辑错误 |
domain_error | 逻辑错误之参数对应的结果值不存在 |
invalid_error | 逻辑错误之无效的参数 |
length_error | 逻辑错误之试图创建一个超出该类型最大长度的对象 |
out_of_range | 逻辑错误之使用了一个超过有效范围的值 |
#include<iostream>
#include<stdexcept>
using namespace std;
int main(){
try{
if(1) throw runtime_error("runtime_error");
else throw logic_error("logic_error");
}catch(runtime_error rerr){
cout<< rerr.what()<<endl;
}catch(logic_error lerr){
cout<< lerr.what()<<endl;
}
}
库 | 其他库异常类 | 描述 |
---|---|---|
<exception> | exception | 只报告异常的发生,不提供任何的额外信息。 |
<new> | bad_alloc | 内存分配失败,一般原因是内存不足,或者将无效值传递给new[] |
<typeinfo> | bad_cast | 当对引用类型的动态转换未通过运行时检查(例如,因为类型与继承无关)时,将引发此类型的异常。 |
上面三种类型的异常都只能通过默认初始化,不允许为这些对象提供初始值。
# include<iostream>
# include<exception>
# include<new>
# include<typeinfo>
using namespace std;
int main(){
exception err;
cout<<err.what()<<endl;
bad_alloc ba;
cout<<ba.what()<<endl;
bad_cast bc;
cout<<bc.what()<<endl;
}
/*
std::exception
std::bad_alloc
std::bad_cast
*/
- 注意的是,当程序运行抛出错误的时候,会自动寻找相应的catch语句。由于在代码中可能有许多try语句和嵌套try语句,抛出异常时会从内向外沿着程序的执行路径回退,寻找相应的catch语句,如果没有找到就执行terminate的标准库函数,该函数会终止当前程序的运行。