习题6.16
在输入两个vector的元素时可以用特定值标记输入,也可以用文件结束符(输入ctrl+z)来控制元素输入的结束,使用后一种方法的时候,在第二个输入循环钱要记得将流cin恢复为有效状态
cout<<"请输入第一个int型vector对象ivec1中的元素:(ctrl+z to end)"<<endl;
while(cin>>num1)
ivec1.push_back(num1);
fflush(stdin);//加入这句清除缓冲区。先清除再设置流状态
cin.clear(); //将cin恢复为有效状态
cout<<"请输入第二个int型vector对象ivec2中的元素:(ctrl+z to end)"<<endl;
while(cin>>num2)
ivec2.push_back(num2);
6.13 try块和异常处理
在<stdexcept>头文件中定义的标准异常类
exception 最常见的问题
runtime_error 运行时错误:仅在运行时才能检测的问题
range_error 运行时错误:生成的结果超出了有意义的值域范围
overflow_error 运行时错误:计算上溢
underflow_error 运行时错误:计算下溢
logic_error 逻辑错误:可在运行前检测到的问题
domain_error 逻辑错误:参数的结果值不存在
invalid_error 逻辑错误:不合适的参数
length_error 逻辑错误:试图生成一个超出该类型最大长度的对象
out_of_range 逻辑错误:使用一个超出有效范围的值
6.14 使用预处理器进行调试
1)使用NDEBUG预处理变量
#ifndef NDEBUG
cerr<<" "<<endl;
#endif
默认情况下,NDEBUG未定义,这意味着必须执行#ifndef 和#endif之间的代码。
开发过程中,保持未定义NDEBUG就会执行其中的调试语句,开发完成后,可通过定义NDEBUG,删除这些调试语句。
2)assert预处理宏
assert() 宏用法
注意:assert是宏,而不是函数。在C的assert.h 头文件中。
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
/* assert example */
#include <stdio.h>
#include <assert.h>
void print_number(int* myInt) {
assert (myInt!=NULL);
printf ("%d\n",*myInt);
}
int main ()
{
int a=10;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (b);
print_number (c);
return 0;
}
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。