发布时间:2024-02-25 16:30
当循环的全部工作在条件就可以完成时,我们通常会用空语句(使用空语句当加上注释):
//重复读入数据直到到达文件末尾或某次输入值为sought
while (cin << s && s != sought)
; //空语句,等价于空块{}
在while
语句的条件或循环体中中定义变量,意味着每次迭代都会创建并初始化该变量。
使用花括号控制执行路径:
if (grade % 10 >= 3) {
if (grade % 10 > 7)
lettergrade += '+';
} else
lettergrade += '-';
//不加花括号就会导致else和最近的if结合
switch
语句中,括号内表达式会被转换为整型。case
标签必须是整型常量表达式。有时候我们希望多个值共享一组操作,此时我们就故意省略掉break
语句(要加注释说明)。
即使默认不做任何工作,也加上default
标签,用于告诉读者已经考虑到了默认的情况,只是目前没有操作。
如果需要为某个case
分支定义变量,应该把变量定义在块内(加花括号),从而确保后面所有的case
标签都在作用域外而无法访问它(不能在可能跳过的代码中包括变量的定义)。
for语句中的init-statement
也可以定义多个对象,但是init-statement
只能有一条声明语句,所以这些对象都应是同一类型。
for
语句头能省略掉init-statement
、condition
和expression
中的任意一个或全部(分号不能省)。
stdexcpt
头文件定义了几种常用的异常类,如exception
、runtime_error
、range_error
、overflow_error
等等。
exception
是最通用的异常类,它只报告异常的发生而不提供任何额外信息。因此可以默认初始化。
对于stdexcpt
中的其他异常类,应该使用string
对象初始化,不允许默认初始化。这些类型只定义了一个.what()
函数,返回const char*
类型的文本信息:
while (cin >> item1 >> item2) {
try {
if (item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN!");
else
...
} catch (runtime_error err) {
cout << err.what()
<< "\nTry again!" << endl;
}
} //程序本来要执行的内容包含在try语句中,因为可能抛出异常
栈:当异常被抛出时,首先搜索抛出该异常的函数。如果没找到匹配的catch
子句,终止该函数,并在调用该函数的函数中继续寻找……如果最终还是没能找到,程序转到名为terminate
的标准库函数(一般导致程序非正常退出)。
异常中断了程序的正常流程。对于那些要处理异常并继续执行的程序,我们必须时刻清楚异常何时发生,异常发生后程序如何确保对象有效、资源无泄漏、程序处于合理状态等。编写异常安全的程序是很难的;仅用本书介绍的技术还不够。