如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格

        前言:在平常的写代码的过程中,或多或少的遇到很多奇怪的 bug ,尤其是一些大的程序,明明上一部分都是好好的,写下一块的时候突然多几百个 bug 的情况,然后这一块写完了后编译的时候直接傻眼了,看着满屏的 bug 根本不知道从哪开始改起,往往只能重新删掉,从头开始写。或者是明明代码写完了,编译器没有任何错误的提示,但是一旦跑起来程序就会立马崩溃。又或者明明代码没问题,跑起来也不报错,但是输出结果就是与期望相差甚远。

        其实以上种种情况的出现,往往都是写代码的习惯不好导致的,绝大多数情况下,拥有一个良好的代码风格可以帮助程序员省去很多的麻烦。

目录

一.注意代码的可读性

二.合理的使用 const

对于普通变量的使用

 对于指针的使用

const 放在 * 左边

const 放在 * 右边

 三.合理的使用 assert

 四.综合示例

1.模拟实现 strlen 函数

 2.模拟实现 strcpy 函数


一.注意代码的可读性

        程序员写的代码不能只是这一个程序员看得懂,在职场中,往往是很多人去维护一个代码,所以,让别人看得懂你写的代码,是一件很关键的事情。

        在写代码的时候,比如变量的申明和命名等,得做到合乎情理,举个例子,现在需要设计个通讯录管理系统,我们设计时需要慎重考虑如何对变量命名,就比如下面这俩段代码:

int main()
{char a[20] = { 0 };int b = 0;int c[11] = { 0 };char d = '0';return 0;
}
int main()
{char name[20] = { 0 };int age = 0;int number[11] = { 0 };char sex = '0';return 0;
}

        虽然这俩段代码设计的内容是一模一样的,变量的大小也是一模一样的,能完成的功能也是一模一样的,但是当你拿到俩个代码,哪个更容易看得懂直接就高下立判了

         所以在我们日常的写代码中,也要注意对于变量的命名等也要稍作思考再进行命名,不仅是为了方便他人,更是为了方便我们自己,如果是不加思考的命名,可能代码写到后部分都已经忘了前部分是干嘛的了

        此外也得多使用注释,对于逻辑的表述要清晰,哪一块代码是干什么用的,哪个变量的命名是为了别的变量服务的,都要使用注释进行申明,这样也可以帮助自己整理思绪,写出更高质量的代码


二.合理的使用 const

        const 在c语言中是关键字,是 constant 的简写,用来定义常量,它限定一个变量不允许被改变,产生静态作用。被 const 修饰的变量,我们称之为常变量。

        这可以更高效合理的帮助我们管理代码,比如在函数传参的时候,我并不希望我传入的参数被改变,我只是想用这个参数算出一个结果,但是并不改变这个参数本身的地址或者数值大小,这个时候我们就可以使用 const 关键字。

对于普通变量的使用

int main()
{int num = 0;num = 10;printf("%d\n", num);num = 200;printf("%d\n", num);system("pause");return 0;
}

我们可以观察到,在使用 const 之前,变量 num 是可以更改的

int main()
{int const num = 0;num = 10;printf("%d\n", num);num = 200;printf("%d\n", num);system("pause");return 0;
}

 但是在添加了 const 之后就不能改被 const 修饰的 num 的值了

 对于指针的使用

const 放在 * 左边

        限制的指针指向的内容,也就是说:不能通过指针来修改指针指向的内容

        但是指针变量是可以修改的,也就是指针指向其他变量的

int main()
{const int num = 10;const int * p = (int*) & num;int n = 1000;*p = 20;//errp = &n;return 0;
}

 在这里就会报错提示

const 放在 * 右边

        限制的是指针变量本身,指针变量不能再指向其他对象

        但是可以通过指针变量来修改指向的内容

int main()
{const int num = 10;int * const  p = (int*) & num;int n = 1000;*p = 20;p = &n;//errreturn 0;
}

  

 在这里就会报错提示


 三.合理的使用 assert

        assert 宏的原型定义在 <assert.h> 中,其作用是先计算表达式的值为假 (即为 0 ),那么它就先向 stderr 打印一条出错信息,然后通过条用 abort 来终止程序;

        比如我们可以写个死循环,正常情况下,死循环的程序会一直跑下去,但是我们使用了 assert 语句后,就会有这样的情况:

int main()
{int i = 1;while (i){i++;assert(i != 10);}return 0;
}

        这里的 while 循环是死循环,每一次i的值加一,从 开始加永远不会为 0while 循环会一直循环下去,可是,我们这里的断言语句每一次都会进行判断,判断当前值是否不等于 10,如果判断条件为假,则进行报错警告,并且终止程序

	assert(i != 10);

 四.综合示例

1.模拟实现 strlen 函数

        既然是函数,那我们对于参数的设计就需要稍微思考了,求字符串的长度的前提就是,我们得拿到这个字符串的地址,拿到地址就需要使用指针,并且我们要的只是拿到地址而已,并不需要对这个地址进行什么更改操作,所以我们这里可以使用 const 进行修饰,并且为了与需求匹配,const 应该放在 *左边

        同时,对于我们传入的地址,我们应该对其进行判断,要求字符串的长度,那首地址总不可能为空吧,所以在这里使用 asset 进行断言,如果传入的地址参数为空就进行报错。

//模拟实现一个strlen函数size_t my_strlen(const char* str)
{//assert(str != NULL);assert(str);size_t count = 0;while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zd\n", len);system("pause");return 0;
}

运行结果示例:

 2.模拟实现 strcpy 函数

        需要将一个字符串拷贝进入另一个字符串,那就需要知道这俩个字符串的地址,在知道地址后我们为了不修改原地址,使用 const 进行维护,同时使用 assert 判断传入的地址参数是否为空,如果为空就报错

char* my_strcpy(char* dest, const char* src)
{//断言char* ret = dest;assert(dest != NULL);assert(src != NULL);//从src指向的字符串中拷贝内容到dest指向的空间//\0也会被拷贝到目标空间while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "xxxxxxxxxxxxxx";char arr2[] =   "hello everyone";printf("%s\n", my_strcpy(arr1, arr2));system("pause");return 0;
}

运行结果示例:

          

        以上就是本次分享的全部内容了,希望对屏幕前的您有所帮助,如有内容上的错误,欢迎指出,也欢迎积极讨论,内容制作不易,给个三连支持一下吧

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】一次性打包学透 Spring | 阿Q送书第五期

文章目录 如何竭尽可能确保大家学透Spring1. 内容全面且细致2. 主题实用且本土化3. 案例系统且完善4. 知识有趣且深刻 关于作者丁雪丰业内专家推图书热卖留言提前获赠书 不知从何时开始&#xff0c;Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中&#xff0c;很…

Ubuntu 配置国内源

配置国内源 因为众所周知的原因&#xff0c;国外的很多网站在国内是访问不了或者访问极慢的&#xff0c;这其中就包括了Ubuntu的官方源。 所以&#xff0c;想要流畅的使用apt安装应用&#xff0c;就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多&#xff0c;比较有…

恒运资本:信创概念再度活跃,华是科技再创新高,南天信息等涨停

信创概念21日盘中再度活跃&#xff0c;截至发稿&#xff0c;华是科技涨超17%&#xff0c;盘中一度触及涨停再创新高&#xff0c;中亦科技涨超13%亦创出新高&#xff0c;久其软件、南天信息、新炬网络、英飞拓均涨停。 音讯面上&#xff0c;自8月3日以来&#xff0c;财政部官网连…

技术博客写作「个人经验分享」

技术博客写作「个人经验分享」 仔细想来&#xff0c;从19年我刚开始试着技术写作算起&#xff0c;已经过去了好几年时间。刚好趁着这次的[赠送奖牌活动(奖牌很好看&#xff0c;我很想要hhh&#x1f602;)],来分享一下我关于技术博客写作的一些个人经验~ 文章目录 技术博客写作「…

Java面试题—2023年8月24日—YDZH

2023-08-24 10:54:28 北京 yī do zh h 答案仅供参考&#xff0c;博主仅记录发表&#xff0c;没有实际查询&#xff0c;不保证正确性。 面试题&#xff1a; 1、请你谈谈关于 Synchronized 和 lock ? 2、请简单描述一下类的加载过程?类加载器有几个种&#xff0c;分别作用是什…

基于 SpringBoot+Vue+Java 的财务管理系统,附源码,教程

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 一 简介第二.主要技术第三、部分效果图第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R…

RabbitMQ介绍

RabbitMQ的概念 RabbitMQ 是一个消息中间件&#xff1a;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按照这种逻辑 RabbitMQ 是 一个快递…

新手小白搭建蛋糕店小程序的方法及步骤分享

在当今的数字化时代&#xff0c;拥有一个自己的小程序已经成为了商家们的一种趋势。小程序不仅可以提升企业的品牌形象&#xff0c;还能够为消费者提供更便捷的购物体验。今天&#xff0c;我将教您如何在五分钟内设计制作自己的蛋糕店小程序&#xff01; 首先&#xff0c;您需要…

C++入门:内联函数,auto,范围for循环,nullptr

目录 1.内联函数 1.1 概念 1.2 特性 1.3 内联函数与宏的区别 2.auto关键字(C11) 2.1 auto简介 2.2 auto的使用细则 2.3 auto不能推导的场景 3.基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的使用方法 4.指针空值nullptr(C11) 4.1 C98中的指针空值 1.内联…

workbench连接MySQL8.0错误 bad conversion 外部组件 异常

阿里云搭建MySQL实用的版本是8.0 本地安装的版本是: workbench 6.3 需要升级到&#xff1a; workbench 8.0 https://dev.mysql.com/downloads/workbench/

HJ31 单词倒排 题解

题目描述&#xff1a;单词倒排_牛客题霸_牛客网 (nowcoder.com) 对字符串中的所有单词进行倒排。 1、构成单词的字符只有26个大写或小写英文字母&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单词间隔符以一个空格表示&#xff1b;如果原字符…

Unity shader 入门之渲染管线一、总览

如下示意图 应用阶段(ApplicationStage)&#xff1a;准备场景信息&#xff08;视景体&#xff0c;摄像机参数&#xff09;、粗粒度剔除、定义每个模型的渲染命令&#xff08;材质&#xff0c;shader&#xff09;——由开发者定义&#xff0c;不做讨论。几何阶段(GemetryStage)&…