C++ 错误处理和调试(编写代码前的准备工作)
错误处理
程序出错的类型大概可以分为两类:
编译时错误(complie-time error) 和 运行时错误(run-time error)
防止编译时错误的编程技巧:
1:开始写代码之前先画出流程图。
2:编译错误不要立刻修改源代码,应该先完整的审阅一遍源代码,再开始纠正错误。
3:检查自己是否已经把所有必要的头文件全部include进源代码了。
4:留意变量的作用域和命名空间。
5:把调试好的代码另外保存起来并不再改动它,然后把这些代码划分成各个模块,需要的时候直接拉取代码即可。
防止运行时错误的编程技巧:
1:培养并保持一种良好的编程风格。
2:多用注释,用好注释。
3:注意操作符的优先级,如果想让一系列操作按照希望的顺序发生,最保险的方式时用括号来确保这种顺序。
4:不要对操作顺序作任何假设,在某些场合,++和*和->之类的高优先级操作符的行为并不是自己想象的那样。
5:千万不要忘记用户输入和文件输入进行合法性检查,最好让别的程序员和用户对你的程序进行合法性检查。
6:不要作任何假设,不要想当然的认为一个应该发生的操作,想当然的认为用户肯定会按照你的意愿去使用你的程序。
7:把程序划分为一些比较小的单元模块来测试程序,程序越长就难以测试,条件允许的情况下应把一些较大的程序划分成一系列比较小的单元模块来加以测试。
错误处理的方法:
让函数返回错误代码:
当程序错误的原因是计算出的结果的值超过了 计算机能表达的最大整数的时候,我们就可以利用climits头文件进行调试
climits头文件:
这个头文件是从C的limits.h的头文件引用过来的。它主要列出了各种数据类型在给定操作系统上的取值范围,并把每种数据类型的最大可取值和最小可取值都分别定义为一个常量来供我们进行比较。
其中:
SHORT_MAX :代表短整数(short int
)类型在给定系统上的最大可取值
SHORT_MIN :代表短整数(short int
)类型在给定操作系统上的最小可取值
USHORT_MAX :代表无符号整数类型(unsigned int
)的最大可取值
ULONG_MAX : 用于在一个程序要判断计算的结果是否超出一个无符号长整型(unsigned long int
)的最大取值,可以使用来提前获取这个值进行对比。
案例:利用climits中的ULONG_MAX指令规定乘积计算结果的范围
#include <iostream>
#include <climits>
using namespace std;
class Factorial //计算阶乘的类型
{
public:
Factorial(unsigned short num);//构造函数的形参列表为 无符号短整型大小类型的数值
unsigned long getFactorial();//计算阶乘的函数的返回值类型为 无符号长整形
bool inRange();//判断结果是否在规定范围内的程序 返回类型为bool布尔类型
private:
unsigned short num;
};
Factorial::Factorial(unsigned short num)
{
this->num= num;//将输入的实参传递给本类的对象中的num成员
}
unsigned long Factorial::getFactorial()//todo计算乘积的程序
{
unsigned long sum = 1;
for (int i = 1; i <= num; i++)
{
sum *= i;
}
return sum;
}
bool Factorial::inRange()
{
unsigned long max = ULONG_MAX;
cout <<"max is"<< max<<"num is"<<num<<"\n\n\n";//todo如果输入参数未5 此时max is 4294967295 num is5
for (int i = num; i >= 1; --i)
{
cout << "for i is" << i<<"for max is"<<max<<"\n\n\n";
max /= i;
}
if (max < 1)//todo如果unisgned long类型最大的数除以乘积的次数 的值小于1 除太多次 数值变为负数
{
return false;//todo返回 假
}
else
{
return true;
}
}
int main()
{
unsigned short num = 0;
cout << "请输入一个整数";
cin >> num;
Factorial fac(num);
if (fac.inRange())
{
cout << num << "的阶乘的值是" <<fac.getFactorial()<<"\n\n" ;
}
else
{
cout << "你所输入的值超过了大小" ;
}
}
运行结果:
扩展内容:
头文件定义的符号常量
头文件定义的符号常量
CHAR_MIN char的最小值
SCHAR_MAX signed char 最大值
SCHAR_MIN signed char 最小值
UCHAR_MAX unsigned char 最大值
SHRT_MAX short 最大值
SHRT_MIN short 最小值
USHRT_MAX unsigned short 最大值
INT_MAX int 最大值
INT_MIN int 最小值
UINT_MAX unsigned int 最大值
UINT_MIN unsigned int 最小值
LONG_MAX long最大值
LONG_MIN long最小值
ULONG_MAX unsigned long 最大值
FLT_MANT_DIG float 类型的尾数
FLT_DIG float 类型的最少有效数字位数
FLT_MIN_10_EXP 带有全部有效数的float类型的负指数的最小值(以10为底)
FLT_MAX_10_EXP float类型的正指数的最大值(以10为底)
FLT_MIN 保留全部精度的float类型正数最小值
FLT_MAX float类型正数最大值