网站建设算无形资产,wordpress 指南,南昌专门做网站的人,交换友情链接的方法前言#xff1a;在平常的写代码的过程中#xff0c;或多或少的遇到很多奇怪的 bug #xff0c;尤其是一些大的程序#xff0c;明明上一部分都是好好的#xff0c;写下一块的时候突然多几百个 bug 的情况#xff0c;然后这一块写完了后编译的时候直接傻眼了#xff0c;看… 前言在平常的写代码的过程中或多或少的遇到很多奇怪的 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 开始加永远不会为 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;
}运行结果示例 以上就是本次分享的全部内容了希望对屏幕前的您有所帮助如有内容上的错误欢迎指出也欢迎积极讨论内容制作不易给个三连支持一下吧