const函数和assert函数:提高代码质量的利器

news2024/11/25 6:48:22

前言

在C++中,const函数和assert函数是非常重要的概念。它们可以帮助我们确保代码的正确性和可靠性。那么在本期,我们将深入探讨这两个概念的作用和用法


目录

前言

 一、如何写出优秀的代码?

二、assert

三、const

const左修饰:

const右修饰:

总结


 一、如何写出优秀的代码?

 什么是优秀的代码?

优秀的代码要符合以下特点:
1. 代码运行正常
2. bug很少
3. 效率高
4. 可读性高
5. 可维护性高
6. 注释清晰
7. 文档齐全

 较好的编码建议:

1. 使用assert
2. 尽量使用const
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱。

举个例子:

模拟实现库函数:strcpy

strcpy是一个C语言中的字符串复制函数,用于将一个字符串的内容复制到另一个字符串中。它的原型如下:char *strcpy(char *dest, const char *src);

 dest是目标字符串的指针,src是源字符串的指针。strcpy会将源字符串的内容复制到目标字符串中,直到遇到\0为止。需要注意的是,如果目标字符串不够大,可能会导致缓冲区溢出的问题。因此,在使用strcpy时,需要保证目标字符串足够大。

char *my_strcpy(char* dest,  char* src)
{
	
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello world!";
	char arr2[20] = "xxxxxxxxxxxxxxxxxxx";
	printf("%s\n", arr2);
	printf("%s\n",my_strcpy(arr2, arr1));
	printf("%s\n", strcpy(arr2, arr1));
	printf("%s\n", arr2);
	return 0;
}

 我们自主实现的strcpy函数是否有问题呢?又或者说是否完美呢?

我们仔细观察my_strcpy这个函数,形参是两个指针类型,并且根据strcpy函数的功能,我们就会发现这个函数的缺陷。

1.源字符串不能被修改。

2.函数my_strcpy函数形参为源字符串的指针,需要避免传进去的指针不是NULL。

这里就需要引进我们的const,和assert。

二、assert

以以下代码为例:

char *my_strcpy(char* dest,  char* src)
{
	
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello world!";
	char arr2[20] = "xxxxxxxxxxxxxxxxxxx";
    char *p=NULL;
	printf("%s\n",my_strcpy(p, arr1));
	printf("%s\n", strcpy(arr2, arr1));
	printf("%s\n", arr2);
	return 0;
}

 我们创建一个指向为NULL的指针,把他传入到my_strcpy的函数中,运行我们会发现,程序崩了(没有输出结果),在其他复杂的程序中很可能会遇到这样的问题,一行一行的找错误又会很麻烦,那要怎么办呢?这时候就可以使用我们的assert来解决。

 在函数执行前先进行断言:

char *my_strcpy(char* dest, char* src)
{
	assert(src != NULL);
	assert(dest != NULL);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello world!";
	char arr2[20] = "xxxxxxxxxxxxxxxxxxx";
	char* p = NULL;
	printf("%s\n",my_strcpy(p, arr1));
	printf("%s\n", strcpy(arr2, arr1));
	printf("%s\n", arr2);
	return 0;
}

 这时我们再次运行就会发现它会报错,并且把错误信息以及错误位置都显示了出来,这样会更便于我们排错。

三、const

前边我们了解到,const修饰后的变量不可以被修改,并没有进行详细介绍,接下来我将会给大家详细介绍以下const。

我们还是以代码为例:

int main()
{
	const int a = 10;
	//a = 20;
	int* p = &a;
	*p = 20;
	printf("%d", a);//20
	return 0;
}

 在VS上敲入以上代码,a在赋值为20时会发生报错,编译器不允许我们这样修改a的值,既然这样不允许那我们取地址使用指针修改,通过运行我们会发现真的把a的值改了。、

const相当于是将存放a房间的门锁上了,不可以直接对a进行修改,但是我们还可以用  “翻窗户”  这样的扫操作进行修改。

既然我们发现了这个漏洞,那我们将p也进行const修饰不就改不了了,我们可以发现,const不仅可以修饰变量还可以修饰指针。

那么接下来我们就针对const修饰指针进行详细介绍

情况一:

const左修饰:

当const在*左边时,限制的是*p,*p不允许被修改(不可以通过指针来修改其所指向的空间里的值,但是p可以改变(p可指向其他空间)。

int main()
{
	const int a = 10;
	int b = 100;
	const int* p = &a;
	//int const* p = &a;与const int* p效更一样。
	//*p = 20;//报错
	p = &b;//可行
	printf("%d", *p);
	return 0;
}

 情况二:

const右修饰:

当const在*右边时,限制的是p,p不允许指向其他空间,但可以通过p修改其所指向空间里的值;

int main()
{
	int a = 10;
	int b = 100;
	int* const p = &a;
	*p = 20;//可行
	p = &b;//报错
	printf("%d", *p);
	return 0;
}

 那我们都两边都加上const呢?

int main()
{
	int a = 10;
	int b = 100;
	const int* const p = &a;
	*p = 20;//报错
	p = &b;//报错
	printf("%d", *p);
	return 0;
}

 这样就把p完全限制,无法进行修改。

 我们了解完const和assert之后,再次对my_strcpy函数进行修改:

#include<stdio.h>
#include<string.h>
#include<assert.h>
char *my_strcpy(char* dest, const char* src)
{
	assert(src != NULL);
	assert(dest != NULL);//注意使用assert一定要包含头文件才可以使用
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello world!";
	char arr2[20] = "xxxxxxxxxxxxxxxxxxx";
	char* p = NULL;
	//printf("%s\n", arr2);
	printf("%s\n",my_strcpy(p, arr1));
	printf("%s\n", strcpy(arr2, arr1));
	printf("%s\n", arr2);
	return 0;
}

 这样修改后代码才能更完美。


 总结

通过本篇博客的学习,相信大家对于const函数和assert函数有了更深入的理解。这两个概念虽然看起来简单,但是却非常重要,它们可以帮助我们写出更加高效、可靠的代码。最后,需要强调的是,const函数和assert函数并不是万能的,它们只是我们编写高质量代码的一部分工具。在实际的开发过程中,我们还需要结合其他的编程技巧和工具来提高代码的质量和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

halcon实现对点云的平移、旋转、线性运动等动画效果操作

一、点云从点A沿直线运动至B点 过程为&#xff1a; 1、读取点云 本例子用凸包算子convex_hull_object_model_3d生成点云&#xff0c;这个步骤可以换成自己的&#xff0c;直接读取点云即可。 2、设置旋转的角度 3、对点云进行转化 4、显示 5、带动画效果的移动代码 dev_…

3D机器视觉市场现状及未来发展趋势

原创 | 文 BFT机器人 当前&#xff0c;3D机器视觉市场正在经历快速发展阶段。多年来&#xff0c;该技术的应用领域也在不断扩大&#xff0c;特别是在工业制造和安防监控等多个领域具有广泛应用。这一持续发展得益于行业技术的不断进步。 3D机器视觉是指利用计算机视觉技术实现对…

关于开源项目 Tinywebserver的使用与配置fatal error: mysql.h: No such file or directory

Tinywebserver的配置和使用可以先看这篇文章配置 但是编译如果报错&#xff1a;fatal error: mysql.h: No such file or directory 文中提示是apt-get install libmysqlclient-dev 如果你执行了上面这条指令后还是编译报出同样错&#xff0c;请继续往下看。 根据提示是没找到m…

广东省21个地市谷歌卫星影像公开下载

广东省21个地市离线谷歌卫星影像数据资源&#xff08;mbt格式&#xff09;&#xff0c;精度在18级0.5米左右分辨率&#xff0c;网盘下载链接&#xff1a;https://pan.baidu.com/s/1gsRNvz_Q1sPooCDdZMqpAw?pwd6666 提取码&#xff1a;6666

基于Zstack协议栈的智慧农业

界面演示 实物演示 包含两个终端节点以及一个协调器&#xff0c;协调器与上位机通过串口线连接&#xff0c;协调器与终端节点树形组网 硬件 cc2530 DHT11 超声波传感器 MQ-2 LED 三极管 直流电机 软件 Qt IAR Sqlyug Mysql 项目架构 智慧农业系统分为上位机和下位机&…

nvm安装后出现node不是内部或外部命令,也不是可运行的程序

nvm作为node管理工具可以在前端开发时&#xff0c;在本地安装多个node版本从来适应不同的工程代码&#xff0c;是比较推荐使用的&#xff01;&#xff01; 注意&#xff1a;在安装使用nvm时&#xff0c;需确保本地没有安装任意版本的nodejs&#xff08;防止环境路径覆盖&#x…

opencv/深度学习框架/图像识别零基础学习课程(代码+视频+详细pdf资料)

课程介绍 open cv 学习掌握OpenCV的所有必要知识是成为一名优秀计算机视觉工程师的必经之路。通过深入学习OpenCV的图像处理、图像分割、特征提取、目标跟踪、机器学习等相关知识&#xff0c;可以让你在面试中更有信心&#xff0c;同时也能够更加流畅地编写高效的代码。不仅如…

代码随想录算法训练营第五十六天

第一题、两个字符串的删除操作 力扣题目链接 class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size()1, vector<int>(word2.size()1, 0));for(int i 1; i < word1.size()1; i){for(int j 1; j &l…

程序员转项目经理 快速成长的5个重点

程序员转项目经理&#xff0c;在刚开始时往往保留原有的固定思维&#xff0c;专注于项目技术的提升和突破&#xff0c;往往容易忽略干系人管理、进度管理、团队建设等问题&#xff0c;从而造成项目进度延期、费用超支等一系列的风险问题。那么我们该如何快速顺利地转型成为合格…

每天一点Python——day47

#第四十七天字典生成式&#xff1a;字典生成的公式 a[ab,ac,ad] b[12,13,14] 把a&#xff0c;b列表合并为字典 将第一个列表中的元素作为字典当中的键&#xff0c;第二个列表中的元素作为字典当中的值 这个过程我们需要打包 我们需要使用内置函数zip()生成字典 #如图所示 #例&a…

加密文件怎么解密?电脑文件加密后的解密方法

加密可以很好地保护电脑中的重要文件&#xff0c;那么加密文件该怎么解密呢&#xff1f;下面我们就一起来了解一下。 EFS加密 在使用EFS加密文件后&#xff0c;指定用户打开文件不需要输入密码。所以&#xff0c;在解密时同样无需输入密码。 我们在EFS加密文件上单击鼠标右键…

用wordpress建站效果怎么样?WordPress建站的8个主要优点

使用WordPress建站具有许多优势&#xff0c;其效果取决于您的需求、技能水平以及所选择的主题和插件。总体而言&#xff0c;WordPress是一个功能强大且灵活的内容管理系统&#xff0c;可用于创建各种类型的网站&#xff0c;从个人博客和企业网站到电子商务平台和社区论坛。 以下…

[Flask] Cookie与Session

由于HTTP的无状态性&#xff0c;为了使某个域名下的所有网页能够共享某些数据&#xff0c;Cookie和Session应运而生 1.Cookie对象 HTTP是无状态(stateless)协议&#xff0c;一次请求响应结束后&#xff0c;服务器不会留下任何关于对方状态的信息 也就是说&#xff0c;尽管在…

Linux——进程信号(上)

目录 前文 一&#xff0c;什么是进程信号 二&#xff0c;信号的产生 2.1 通过按键终端产生信号 2.2 调用系统函数向进程发信号 2.3 由软条件产生信号 2.4 硬件异常产生信号 总结 前文 上文主要讲了一下进程间用管道通信的相关知识&#xff0c;本文主要带领大家深度认识一…

cpolar在windows系统下的关闭方法

计算机&#xff0c;右键-管理 管理–服务–cpolar service&#xff0c;停止服务

InfluxDB 压力测试

一、基础环境 1. InfluxDB V1.7.8&#xff0c;预置了10.3G 数据做为初始数据 &#xff08;调整了 部分参数&#xff0c;否则数据库动不动就崩溃&#xff09; 2. 模拟141个设备&#xff0c;共计1390个点位 3. 服务器配置 128G内存&#xff0c;2.4Ghz CPU&#xff0c;虚拟机 …

前端十万个为什么——软件设计的架构模式

&#x1f600;博主&#xff1a;小猫娃来啦 &#x1f600;文章核心&#xff1a;软件设计的架构模式 上篇文章&#xff0c;我们聊了一下前端的普遍性问题以及解决策略。书接上文&#xff0c;我们今天聊聊软件设计的架构模式。 在正文开始前&#xff0c;先思考几秒&#xff1a;为…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(二)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践&#xff0c;帮助开发组织减少发布的软件中的漏洞数量&#xff0c;减少利用未检测到或未解决的漏洞的潜在影响&#xff0c;从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

想学会如何翻译pdf中的英文?让我教你三招

曾经有一个名叫小明的年轻人&#xff0c;他是一名热爱阅读的书虫。每天&#xff0c;他都会沉浸在大量的pdf文档中&#xff0c;探索着各种知识的海洋。然而&#xff0c;有时候他遇到了一些困扰&#xff0c;因为有些pdf文档并不是他熟悉的语言书写的。小明很苦恼&#xff0c;他希…