第五章-语句

本文详细讲解了C++中的条件语句如if-else与嵌套结构,switch语句的执行规则,以及如何避免变量作用域问题。还探讨了try-catch异常处理机制,常见运行时错误类型及其解决方案。同时,强调了数据结构如范围for、do-while和迭代在编程中的正确使用。
摘要由CSDN通过智能技术生成

条件语句

  • else与离它最近的尚未匹配的if匹配
if (grade % 10 >= 3)
	if (grade % 10 > 7)
		...
else
	...
//从代码缩进上看期望else与最上面的if匹配
//可惜这里的else其实是和内层if匹配的
//想要让else和外层的if匹配,可以在内层if的两端加上花括号形成块
if (grade % 10 >= 3)
{
	if (grade % 10 > 7)
		...
} else
	...
  • switch语句执行跳过某个特定case而执行另一个case,如果有个变量定义在前面的case而使用在后面的case,此时将发生绕过初始化直接使用的错误。所以要在某个分支定义并初始化一个变量,就应该把变量定义在块内,以此让后面的case标签都在变量的作用域之外
case true:
	{
		string s = ....;
		...
	}
	break;
case false;
	if (s) //错误,s不在作用域中

迭代语句

  • 范围for语句,用来遍历容易或其他序列的所有元素
vector<int> v = {1, 2, 3};
for(auto &r : v)
	r *= 2;
//如果要修改v中元素,就要将r声明成引用
//使用范围for语句就不能在中途添加\删除vector的元素了
//因为范围for语句预存了vector的end(),一旦添加\删除就会改变end()
  • 下面do-while中condition中使用的变量必须定义在循环体之外
do
	statement;
while (condition);

try语句和异常处理

  • 异常检测部分使用throw表示遇到了无法处理的问题
if (item1.isbn() == items.isbn())
	...
else
{
	cout << "Error!\n";
	return -1;
}
//使用throw改写
if (item1.isbn() != item2.isbn())
	throw runtime_error("xxx");
	//runtime_error是异常的一种
	//给它提供一个string或者C风格的字符串,表示关于异常的辅助信息
cout << item1 + item2 << endl;
//使用try语句块
while (cin >> item1 >> item2)
{
	try
	{
		if (item1.isbn() != item2.isbn())
			throw runtime_error("xxx");
		cout << item1 + item2 << endl;
	} catch (runtime_error err)
	//如果try抛出runtime_error异常,就交给这个catch处理
	{
		//每个异常类都有个what成员函数
		//返回初始化具体对象时使用的string对象的副本
		//这里会输出xxx
		cout << err.what()
			 << "\nTry Again? Enter y or n" << endl;
		//提醒用户两个ISBN用户必须一致,询问是否重新输入
		char c;
		cin >> c;
		if (!cin || c == 'n')
			break;
	}
}
  • try可能调用包含另一个try的函数,而新的try可能又调用另一个包含try的新函数。但是异常被抛出时会先搜索抛出该异常的函数,如果没匹配到catch,会终止该函数,然后在调用该函数的函数中继续寻找catch…依此沿着执行路径逐层回退直到找到catch。如果到最后都没找到catch,会执行terminate终止程序
runtime_error运行时才能检测出的问题
range_error运行时错误:生产的结果超出了有意义的值域范围
overflow_error运行时错误:计算上溢
underflow_error运行时错误:计算下溢
logic_error逻辑错误
domain_error逻辑错误:参数对应的结果值不存在
invalid_argument逻辑错误:无效参数
length_error逻辑错误:试图创建一个超出该类型最大长度的对象
out_of_range逻辑错误:使用一个超出有效范围的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值