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

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


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

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


一.注意代码的可读性

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

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

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;//err
  p = &n;
  return 0;
}

在这里就会报错提示

const 放在 * 右边


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

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

int main()
{
  const int num = 10;
  int * const  p = (int*) & num;
  int n = 1000;
  *p = 20;
  p = &n;//err
  return 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 开始加永远不会为 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;
}

运行结果示例:

         

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

目录
相关文章
|
10月前
|
人工智能 自然语言处理 安全
如何提升代码质量,重构并非“万能药”
随着编程技术的不断进步,编程语言变得越来越高级,功能封装也越来越完善。各种技术都在帮助程序员提高编写代码的效率。通过层层封装,程序员似乎不需要了解技术细节,只需逐行翻译需求内容即可。 许多程序员不了解如何组织代码、提升运行效率以及底层基于的原理是什么,但是他们编写的代码通过了编译、测试,并且在上线运行了一个月而没有出现问题,似乎并没有对他们的实际工作产生明显的负面影响。
|
2月前
|
测试技术 开发者 UED
自动化测试在软件开发中的重要性
在当今快速发展的软件行业中,软件质量成为了决定产品成功与否的关键因素之一。而自动化测试作为提高软件质量和加速软件开发过程的重要手段,正受到越来越多软件开发者的青睐。本文将从自动化测试的定义、优势以及实施过程中的注意事项等方面进行探讨,旨在帮助读者更好地理解和应用自动化测试在软件开发中的重要性。
|
2月前
|
机器学习/深度学习 人工智能 大数据
自动化测试在软件开发中的重要性与应用
自动化测试是软件开发过程中不可或缺的一环,它通过编写脚本和工具来执行测试用例,提高了软件测试的效率和准确性。本文将探讨自动化测试在软件开发中的重要性、应用场景以及未来发展方向。
21 0
|
2月前
|
Java 测试技术 持续交付
自动化测试在软件开发中的重要性和应用
随着软件开发的迅速发展,自动化测试技术在软件开发生命周期中发挥着越来越重要的作用。本文将探讨自动化测试在软件开发中的重要性和应用,并介绍了一些常见的自动化测试工具和最佳实践。
|
2月前
|
算法 测试技术 持续交付
代码重构:提升软件质量的艺术与实践
代码重构:提升软件质量的艺术与实践
87 0
|
2月前
|
安全 NoSQL 程序员
【年度征文 健壮代码 心得体会】 如何编写健壮的C++代码
【年度征文 健壮代码 心得体会】 如何编写健壮的C++代码
66 0
|
10月前
|
算法 Java 测试技术
提高代码质量的7个实用技巧
在Java开发中,编写高质量的代码是非常重要的。良好的代码质量不仅可以提高程序的可维护性和可读性,还能减少潜在的bug和错误。本文将介绍七个实用技巧,帮助Java开发人员提高代码质量。
373 0
|
8月前
|
存储
十种高级的代码书写方式,提高代码质量和工作效率
十种高级的代码书写方式,提高代码质量和工作效率
39 0
|
jenkins 测试技术 持续交付
初学者回归测试的基础
回归测试 是一种用于测试产品的增量验证技术。它旨在验证在正在进行的开发过程中,产品的新变化没有破坏现有功能。为每个新功能添加新的测试用例可确保回归测试成功。
104 0
|
测试技术
测试思想-测试设计 测试用例设计最新实践总结-来自不断的追求
测试思想-测试设计 测试用例设计最新实践总结-来自不断的追求
66 0