第六章 语句
1. 每个case不一定非要另起一行
case 1: case 2: case 3: case 4: case 5:
++i;
break;
case值必须是整型常量表达式
有两个case标号的值相同则编译错
良好的程序要定义default: 即使没有什么要做的,;空语句也行
switch内部的变量定义:规定只能在最后一个case之后或default之后定义变量,要为某个case定义变量,那么要加{}。这样是为保证这个变量在使用前被定义一初始化(若直接执行后面case,且用到了这个变量 ,由于作用域可见,但未定义就使用了)
2. do{}while();以;结束不能在while语句中定义变量
do{ numble(foo);} while(int foo=get_foo())
3.for语句的初始化语句中定义多个对象必须具有相同的一般类型:
const int size=42;
int val=0,ia[size];
for(int ival=0,*pi=ia,&ri=val;ival!=size;++ival,++pi,++ri) //一个int,一个int指针,一个int引用
4.break只能出现在循环或switch结构中,或者出现在嵌套于循环或switch结构的语句里。
continue语句导致最近的循环语句的当次迭代提前结束。只能出现在for/while或do while循环中,包括嵌套这些循环内部的块语句中。
5.在设计良好的程序中, 异常是程序错误处理的一部分
异常是运行时出现的异常
#include<stdexcept>
try {
if (true)
throwruntime_error(“error!”);
}
catch (runtime_error err)
{
cout << err.what() << endl;
}
先在当前代码中找catch,若没有匹配的,则一上层调用函数中寻找,若仍没找到,则一直找下去,最终由#include <exception>中定义的terminate终止程序执行。若程序在没有try catch的地方出现异常,则由terminate自动终止程序的执行
bitset的to_ulong操作,若提供的位数大于unsigned long的长度32位时,就异常overflow_error,查看t6_23
bitset<33> ib;
ib[ib.size()-1] = 1; // 最高位是1
try{
ib.to_ulong();
}
catch (overflow_error err)
{
cout<< "overflow" << endl;
cout<< err.what() << endl; // what返回const chat*
}
catch (runtime_error err)
{
cout<< "runtimeerror" << endl;
cout << err.what() << endl;
}
6.异常类 #include <stdexcept>
exception // 最常见异常类
runtime_error // 下面几个运行时错
range_error // 生成的结果超出了有意义的值域范围
overflow_error // 上溢
underflow_error // 下溢
logic_error // 可在运行前检测到的问题,下面几个逻辑错
domain_error // 参数的结果值不存在
invalid_argument // 不合适的参数
length_error //超出该类型最大长度
out_of_range //使用一个超出有效范围的值
#include <new>
bad_alloc
#include <type_info>
bad_cast
以上红色的三个只有默认构造函数,不使用string初始化
7. 使用预处理器编写调试代码
#ifndef NDEBUG
cerr << “oh,shit!” << endl;
#endif
很多编译器执行时
$ CC –DNDEBUG main.C
相当于在main.c开头提供#define NDEBUG预处理命令
8. 预处理宏assert #include <cassert>
assert(expr)与NDEBUG配合使用的
只要NDEBUG没有定义,则执行assert,若为false则输出信息并终止程序的执行
测试不可能发生的条件
异常是处理预期要发生的错误,而断言是测试不可能发生的事情
一旦开发和测试完成,程序就已经建立好,并定义了NDEBUG。成品代码中,assert不执行,因此没有运行时代价,没有运行时检查。
assert仅用于检查确定不可能的条件,只对程序的调试有帮助,不能用来代替运行时的逻辑检查logic_error,也不能代替对程序可能产生的错误runtime_error的检查