如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格
前言:在平常的写代码的过程中,或多或少的遇到很多奇怪的 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的值加一,从 1 开始加永远不会为 0,while 循环会一直循环下去,可是,我们这里的断言语句每一次都会进行判断,判断当前值是否不等于 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;
}
运行结果示例:
以上就是本次分享的全部内容了,希望对屏幕前的您有所帮助,如有内容上的错误,欢迎指出,也欢迎积极讨论,内容制作不易,给个三连支持一下吧
相关文章:
如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格
前言:在平常的写代码的过程中,或多或少的遇到很多奇怪的 bug ,尤其是一些大的程序,明明上一部分都是好好的,写下一块的时候突然多几百个 bug 的情况,然后这一块写完了后编译的时候直接傻眼了,看…...
Java如何调用接口API并返回数据(两种方法)
Java如何调用接口API并返回数据(两种方法) java处理请求接口后返回的json数据-直接处理json字符串 处理思路: 将返回的数据接收到一个String对象中(有时候需要自己选择性的取舍接收) 再将string转换为JSONObject对象 …...
极狐GitLab 价值流管理之「总时间图」使用指南
本文来源:about.gitlab.com 作者:Haim Snir 译者:极狐(GitLab) 市场部内容团队 对于软件研发管理者来说,了解在整个研发过程中时间都耗费在了哪些地方,是进行交付价值优化的关键洞察。GitLab / 极狐GitLab 新的价值流分…...
Mybatis入门和环境搭建
文章目录 一. Mybatis的简介1. 什么是ORM?2. 什么是持久层?3. Mybatis的作用 二. Mybatis环境搭建1. 搭建一个数据库2. 创建maven项目并导入相关依赖3. Mybatis相关插件安装4. Mybatis.cfg.xml核心配置文件 三. 基于ssm逆向工程的使用1. 配置generatorConfig.xml2.…...
React 全栈体系(二)
第二章 React面向组件编程 一、基本理解和使用 1. 使用React开发者工具调试 2. 效果 2.1 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函数式组件</title> </head> &l…...
【Linux】socket编程(二)
目录 前言 TCP通信流程 TCP通信的代码实现 tcp_server.hpp编写 tcp_server.cc服务端的编写 tcp_client.cc客户端的编写 整体代码 前言 上一章我们主要讲解了UDP之间的通信,本章我们将来讲述如何使用TCP来进行网络间通信,主要是使用socket API进…...
七大出海赛道解读,亚马逊云科技为行业客户量身打造解决方案
伴随全球化带来的新机遇和国内市场的进一步趋于饱和,近几年,中国企业出海快速升温,成为了新的创业风口和企业的第二增长曲线。从范围上看,出海市场由近及远,逐步扩张。从传统的东南亚市场,到成熟的北美、欧…...
【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~
Maven基础使用篇 1️⃣ 编写 POM2️⃣ 编写业务代码3️⃣ 编写测试代码4️⃣ 打包和运行5️⃣ 使用 Archetype生成项目骨架 1️⃣ 编写 POM 到目前为止,已经大概了解并安装好了Maven环境, 现在,我们开始创建一个最简单的 Hello World 项目。如果你是初次…...
Spring Boot + Spring Data JPA 实现数据库操作的标准示例
环境搭建 本篇使用H2内存数据库演示Spring Data JPA 的使用。 导入JPA和H2的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><…...
JVM——类加载器
回顾一下类加载过程 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义…...
async/await 编程理解
博客主要是参考 Asynchronous Programming in Rust ,会结合简单的例子,对 async 和 await 做比较系统的理解,如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码,async 声明的代码块实现了 Future 特性&a…...
1. Java基础知识介绍
文章目录 1. Java基础知识介绍1. 简单输入输出1.1 输入1.2 输出 2. 数据类型2.1 基本数据类型2.2 引用数据类型 3. 函数4. 类基础知识5. 小结 1. Java基础知识介绍 1. 简单输入输出 在Java编程中,我们经常需要与用户进行交互,以获取输入并输出结果。Ja…...
基础shell小技巧01
1. 命令替换 shell脚本中最有用的特性之一是可以从命令输出中提取信息并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。在脚本中处理数据时,这个特性显得尤为方便。 有两种方法可以将命令输出赋给变量。 反引号(࿰…...
微信小程序--data的赋值与取值的几种方式
通过小程序官方文档可知: 赋值一定需要注意。需要setData的使用,这样页面才刷新,数据才会改变,并且分清that和this的使用 Page() 函数用来注册一个页面。接受一个 object 参数,其指定页面的初始数据、生命周期函数、事…...
条码通讯配置
由Leuze(劳易测) LSIS 222 M5M-R1/MA208i系统组成 连接说明及器件明细: 打开条码调试软件BPS Configuration tool对M208i进行ip 和端口号进行配置,条码选择作为客户端,输入ip和端口号,选择串口通讯波特…...
知网G4期刊《高考》简介及投稿要求
知网G4期刊《高考》简介及投稿要求 一、《高考》期刊简介: 主管单位:长春市委宣传部 主办单位:长春出版社 国内刊号22-1372/G4 国际刊号1673-6265 代号12-240 编辑单位:《高考》杂志社 出版周期:旬刊 类 …...
第7章 CPU前端优化
接下来讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。 标准的算法和数据结构在性能敏感型工作负载并不总能表现的很好。例如,在“扁平化”数据结构的冲击下,链表基本上快被放弃了。传统链表中的每个节点都是动态分配的,除了…...
idea新建Java-maven项目时,出现Dependency‘xxx(jar包名)‘ not found的解决方案
项目场景: 项目场景:使用idea创建maven项目时,导入简单依赖时(本文以mysql-connector-java为例)。 问题描述 问题: 首先,在创建新的maven项目中,出现下列两种情况: &am…...
STM32--USART串口
文章目录 通信接口串口通信硬件电路电平标准参数时序 USART主要特性框图 数据帧发送器 波特率发生器SWART串口发送与接收工程串口收发数据包 通信接口 通信接口是指连接中央处理器(CPU)和标准通信子系统之间的接口,用于实现数据和控制信息在不…...
2023年Java毕业设计题目推荐,怎样选题?500道毕业设计题目推荐
大家好,我是程序员徐师兄,最近有很多同学咨询,说毕业设计了,不知道选怎么题目好,有哪些是想需要注意的。 今天,我整理了一些Java毕业设计的题目,可以参考一下,希望对大家有所帮助 文章目录 一、…...
基于数据湖的多流拼接方案-HUDI概念篇
目录 一、为什么需要HUDI? 1. 传统技术选型存在哪些问题? 2. Hudi有什么优点? 基于 Hudi Payload 机制的多流拼接方案: 二、HUDI的应用场景 1. 什么场景适合使用hudi? 2. 什么场景不适合使用hudi? …...
OpenCV基础知识(5)— 几何变换
前言:Hello大家好,我是小哥谈。OpenCV中的几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、旋转和透视效果。这些几何变换操作都涉及复杂、精密的计算。OpenCV将这些计算过程都封装成了非常灵活的…...
Linux下源码安装MySQL 8.0
MySQL 8.0源码安装 环境准备步骤 环境准备 Linux环境,本文基于CentOS 8 MySQL安装包,本文基于MySQL 8.1,以下为带boost MySQL 8.1源码下载地址: https://dev.mysql.com/get/Downloads/MySQL-8.1/mysql-boost-8.1.0.tar.gz 步骤…...
大聪明教你学Java | 深入浅出聊 Java 内存模型
前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言💌~ 在多线程环境下,多个线程同时访问共享数据可能导致一系列问题,如数据不一致、竞态条件和死锁等…...
SAP ABAPG开发屏幕自动生成日期的搜索帮助
代码如下: REPORT z_jason_test_f4 . TABLES: s031. PARAMETER p_spmon TYPE spmon DEFAULT sy-datum0(6) OBLIGATORY. SELECT-OPTIONS s_spmon FOR s031-spmon DEFAULT sy-datum0(6) OBLIGATORY. AT SELECTION-SCREEN ON VALUE-REQUEST…...
leetcode 674. 最长连续递增序列
2023.8.24 与最长递增子序列 类似,不同的是, 本题要求连续序列,所以不需要第二层遍历比较之前所有的元素了,只需要比较上一个元素i-1。 dp[i]的含义为:以nums[i]元素为结尾的序列的最长递增子序列。 注意这里是以i为结…...
Mysql简短又易懂
MySql 连接池:的两个参数 最大连接数:可以同时发起的最大连接数 单次最大数据报文:接受数据报文的最大长度 数据库如何存储数据 存储引擎: InnoDB:通过执行器对内存和磁盘的数据进行写入和读出 优化SQL语句innoDB会把需要写入或者更新的数…...
vue 简单实验 v-model 变量和htm值双向绑定
1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"two-way-binding"><p>{{ message }}</p><input v-model"message" /> </div> <script>…...
测试框架pytest教程(8)失败重试-pytest-rerunfailures
pytest-rerunfailures是一个pytest插件,用于重新运行失败的测试用例。当测试用例在第一次运行时失败,该插件会自动重新运行指定次数的失败用例,以提高稳定性和减少偶发性错误的影响。 要使用pytest-rerunfailures插件,需要按照以…...
6个主流的工业3D管道设计软件
3D 管道设计软件是大多数行业工程工作的主要部分,例如: 电力、石油和天然气、石化、炼油厂、纸浆和造纸、化学品和加工业。 全球各工程公司使用了近 50 种工厂或管道设计软件。 每个软件都有优点和缺点,包括价格点。 EPC 和业主部门当前的趋势…...
wordpress小工具开发/免费快速网站
APP是进入移动互联网的重要载体,故得到越来越多开发者的关注。打造APP,无论是开发、产品、运营、推广等任意一个环节都离不开海量数据的支持。这样一来,怎样采集,存储,整理,分析,挖掘海量数据成…...
西安网站建设公司找哪家/自建站模板
本文将以centos系统为例,说明kdump的配置。什么是kdumpkdump 是一种crash dump捕获机制,用来捕获kernel crash时候产生的crash dump。kdump需要配置两个不同目的的kernel,其中一个我们在这里称作standard(production) kernel;另外…...
星夜智能建站平台/seo公司 上海
最近写了一些代码,想统计一下代码的行数,在eclipse中好像没这功能,网上搜了一下才发现原来Linux有一个统计文件行数的命令wc。使用wc可以打印出每个文件和总文件的行数、字数和字节数,如果没有指定文件,则会读取标准输…...
天津高端网站建设公司/快速优化网站排名的方法
用了这么久的Select2插件,也该写篇文章总结总结。当初感觉Select2不是特别好用,但又找不到比它更好的下拉框插件。 在我的印象里Select2有2个版本,最新版本有一些新的特性,并且更新了一下方法参数,比最初版本要好看一些…...
毕业设计做 什么网站好/搜索引擎是软件还是网站
相同点:两个方法都是先触发间隔时间,再触发回调函数 区别: 1.setInterval每隔指定的时间就执行一次表达式,若不停止会一直执行下去 而setTimeout在执行时,是在载入后延迟指定时间后,去执行一次表达式,次数仅为一次 2.将setTimeo…...
公司网站建设济南/seo免费推广软件
现在大多数人使用的计算机操作系统都是64位的,最近开了一门微机原理的课,需要对汇编语言编写的程序进行调试,但是64位的系统默认不搭载debug程序,编写的程序无法用系统自带的dos模式调试。在网上查了很多经验已完美解决windows下调…...