塔奇克马敲代码

导航

 

第5章 语句


  1. 空语句,只含有一个单独的分号":"。通常用与处理在语法上需要一条语句但逻辑上不需要的情况。使用空语句时应该加上注释,从而令读者意识到该句是有意省略的。
  2. 块,语法上需要一条语句,但逻辑上需要多条语句。
  3. 悬垂 else,if分支多于 else分支,如何确定某个给定的 else语句与哪一个 if匹配?这样的问题称为悬垂 else。C++解决此问题的方式是,规定 else与离它最近的尚未匹配的 if匹配。因此,若想令内存 else与外层 if语句匹配,可以使用花括号 {}来控制执行路径。
  4. switch后的表达式必须是整型常量表达式或能转换成此类型的值。
  5. 为了避免执行后续 case分支的代码,需要加上 break语句。但同样的,如果希望两个或更多的值共享同一操作,也可以故意省略掉 break语句。不过此时最好在注释语句中加以说明。
  6. 如果需要为某个 case分支定义并初始化一个变量,应该把变量定义在块内,从而确保后面的所有 case标签都在变量的作用域之外。
@autor taqikema
case true:
    {
        // 正确,声明语句位于语句块内部
        string file_name = get_file_name();
        // ...
    }
    break;
case false:
    if (file_name.empty())  // 错误:file_name不在作用域之内
  1. 范围 for语句,如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。配合 auto使用,不需要担心元素类型出错和下标越界情形,简单易用。
vector<int> v = {0, 1, 2, 3};
for(auto &r : v)
r *= 2;
  1. do while语句
do {
    statement;
} while (condition);

注意,在括号围起来的条件后面用一个分号表示语句结束!另外,与循环的条件判断有关的变量不能定义在 do内部,因为定义在 do花括号内部的变量其作用域就只在花括号围起来的代码块中。下面写法就是错误的!

do {
    int ival = get_response();
} while (ival);  // 错误,此时 ival未定义!
  1. 异常检测。在实际编程中经常会需要处理意外情况,使用普通的 if-else语句可以处理这种情况,但是此时异常检测和异常处理这两部分的代码将会耦合在一起,不利于功能块的划分和单独实现。使用 try语句块和 catch子句可以很好地将异常的检测和处理分开,并且对于异常发生时内存的回收也能很好的处理。
  2. 寻找匹配的 catch子句的过程与函数调用链刚好相反。首先在抛出异常的函数中寻找匹配的 catch子句,找到的话就继续执行 catch子句后本函数的相关内容;没有找到则在调用该函数的新函数中继续寻找,以此类推。如果最后还是没有找到匹配的 catch子句,则调用 terminate函数终止程序。
  3. 异常发生时,简单的程序通常终止程序就可以了。但是在大型应用中,却需要处理异常并继续执行程序,此时就需要加倍注意了。必须清楚异常发生后仍需要使用的对象此时是否有效、不需要的对象是否已经删除、资源有无泄漏等情况。
posted on 2017-12-31 14:10  塔奇克马敲代码  阅读(105)  评论(0编辑  收藏  举报