提醒:(1)回头看关于迭代器的知识。
6.1 简单语句
笔记:(1)空语句应加上注释。
(2)注意循环体后的空语句,是否已改变程序员意图,造成无限循环或错误。
6.2 声明语句
笔记:(1)变量的定义有且只有一个,声明(extern)可以有很多个。
(2)声明只有在函数体外才能进行初始化,此时属于定义,之后再对其进行定义是错误的。
6.3 复合语句
笔记:(1)块内引入的名字只能在块内使用,块外不可见。
6.4 语句作用域
问题:(1)对于作用域外的变量,是不可能用到其在作用域内的残留值的。这句话是什么意思?
例如:vector<int>::size_type index=0;
for(;index!=vec.size();++index)
.......;//循环结束后,index的值还是0?
if(index!=vec.size())
.......;//是否是这样:当在外面定义时,后续语句可以使用其在先前语句中的残留值
//当在块内定义时,后续语句不能访问此变量?(经程序验证,此理解正确)
6.5 if语句
问题:if(minval>ivec[i]){
minval=ivec[i];
occurs=1;
}//若执行此条件,则将ivec的值给minval,occurs的值为1;
if(minval==ivec[i])
++occurs;//再执行此条件,occurs的值为2?(经程序验证,occurs的值为2)
笔记:当出现if子句多于else子句时,遵守规则是:将else子句配给距离最近的尚未匹配的if子句。
所以总在if子句后面使用花括号是个不错的办法。
6.6 switch语句
问题:(1)为什么会出现变量未定义?在之前的语句不是已经定义了么?只能在最有一个case标号或defualt之后定义变量,为什么?
(2)习题6.14(c)
笔记:(1)对于switch语句,漏写break是错误的,会导致程序越过case边界继续执行。
如果逻辑需要省略break,这种情况很少见,需要注释说明。
(2)default语句是为了说明在switch之外的情况,至于是否需要执行别的语句,视情况而定,但至少要有一个空语句。
(3)在统计字符串的空格,换行等字符时,应使用cin的get对象:cin.get()作为输入
(4)case语句后只能使用常量表达式,或者const 限定的变量。不能直接使用变量。
6.8 for循环语句
问题:习题6.16,为什么当使用结束符来控制输入时,需要将流cin恢复为有效状态?
6.9 do while 语句
问题:习题6.17(b)难道ival的作用域不会被限制在do里边吗?为什么循环条件仍可以使用?
笔记:所有在条件中会用到的变量必须在do之前定义
6.10 break语句
笔记:break出现在循环或switch之外会导致编译错误。
6.12 goto语句
笔记:(1)尽量不使用goto语句,以免程序难以理解和调试。
(2)向前跳过已经定义过的变量是合法的,向后跳则不合法。
6.13 异常处理
笔记:(1)使用throw来抛出异常,终止程序并移交处理异常的程序。
(2)如果程序中出现的异常没有经过try的定义,则没有相应的catch来解决,程序会非正常退出。