当前位置: 首页 > news >正文

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类型正数最大值

相关文章:

  • 将整型数字转换为大写汉字的自定义函数,如转换为'壹贰
  • C++ assert函数与捕获异常
  • WCF开发日志 -- OEA里面的WCF设计
  • C++ 内存分配
  • C++ 动态内存管理
  • IOS学习资源
  • C++ 从函数或方法返回动态内存(函数指针与指针函数)
  • PHP实现多web服务器共享SESSION数据-session数据写入mysql数据库
  • C++ 副本构造器
  • C++常识之——C++中堆和栈的区别,自由存储区、全局/静态存储区和常量存储区...
  • C++ 高级强制类型转换
  • thinkphp的一些类库
  • C++ 指针和引用
  • 9月24号忘记
  • C++ 避免内存泄漏
  • Google 是如何开发 Web 框架的
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • java2019面试题北京
  • Linux各目录及每个目录的详细介绍
  • MaxCompute访问TableStore(OTS) 数据
  • passportjs 源码分析
  • Redis在Web项目中的应用与实践
  • 对JS继承的一点思考
  • 对象管理器(defineProperty)学习笔记
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 力扣(LeetCode)965
  • 实现菜单下拉伸展折叠效果demo
  • 数据科学 第 3 章 11 字符串处理
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 函数计算新功能-----支持C#函数
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (Java)【深基9.例1】选举学生会
  • (vue)页面文件上传获取:action地址
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (五)c52学习之旅-静态数码管
  • (译) 函数式 JS #1:简介
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net 托管代码与非托管代码
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET和.COM和.CN域名区别
  • .NET企业级应用架构设计系列之开场白
  • .Net下的签名与混淆
  • .project文件
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ NOI 2001 ] 食物链
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?