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的标准库函数,该函数会终止当前程序的运行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值