【C++Primer笔记】第五章 语句

文章目录

    • 简单、条件语句
    • try语句块和异常处理

简单、条件语句

  1. 当循环的全部工作在条件就可以完成时,我们通常会用空语句(使用空语句当加上注释):

    //重复读入数据直到到达文件末尾或某次输入值为sought
    while (cin << s && s != sought)
    	; //空语句,等价于空块{}
    
  2. while语句的条件或循环体中中定义变量,意味着每次迭代都会创建并初始化该变量。

  3. 使用花括号控制执行路径:

    if (grade % 10 >= 3) {
        if (grade % 10 > 7)
            lettergrade += '+';
    } else
        lettergrade += '-';
    //不加花括号就会导致else和最近的if结合
    
  4. switch语句中,括号内表达式会被转换为整型。case标签必须是整型常量表达式。有时候我们希望多个值共享一组操作,此时我们就故意省略掉break语句(要加注释说明)。

  5. 即使默认不做任何工作,也加上default标签,用于告诉读者已经考虑到了默认的情况,只是目前没有操作。

  6. 如果需要为某个case分支定义变量,应该把变量定义在块内(加花括号),从而确保后面所有的case标签都在作用域外而无法访问它(不能在可能跳过的代码中包括变量的定义)。

  7. for语句中的init-statement也可以定义多个对象,但是init-statement只能有一条声明语句,所以这些对象都应是同一类型。

  8. for语句头能省略掉init-statementconditionexpression中的任意一个或全部(分号不能省)。

try语句块和异常处理

  1. stdexcpt头文件定义了几种常用的异常类,如exceptionruntime_errorrange_erroroverflow_error等等。

  2. exception是最通用的异常类,它只报告异常的发生而不提供任何额外信息。因此可以默认初始化。

  3. 对于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语句中,因为可能抛出异常
    
  4. 栈:当异常被抛出时,首先搜索抛出该异常的函数。如果没找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找……如果最终还是没能找到,程序转到名为terminate的标准库函数(一般导致程序非正常退出)。

  5. 异常中断了程序的正常流程。对于那些要处理异常并继续执行的程序,我们必须时刻清楚异常何时发生,异常发生后程序如何确保对象有效、资源无泄漏、程序处于合理状态等。编写异常安全的程序是很难的;仅用本书介绍的技术还不够。

你可能感兴趣的:(C++Primer笔记,c++)