上期补充:在 Release 版本下,运行实例二
(说明发布版本下对程序的优化)
5. 如何写出好(易于调试)的代码
(1). 优秀的代码:
1. 代码运行正常
2. bug很少
3. 效率高
4. 可读性高
5. 可维护性高
6. 注释清晰
7. 文档齐全
常见的coding(编码)技巧:
1. 使用assert(断言)
2. 尽量使用const(赋予常属性,无法修改)
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱(类似 标题4 中的 实例二)
(2). 示范一:模拟实现库函数:strcpy
#include <stdio.h> //模拟实现库函数:strcpy,把一个字符串赋给另一个字符串。 //形参 为 目标地址、被复制字符串地址 //返回值 为 char* :返回目标地址的首元素地址 //复制包括 结束符:“\0” #include <assert.h> void my_strcpy(char* dest, char* src) { //如果 目标地址 是 NULL空指针 就会出问题 //为防止出现空指针,可以设置 断言asset宏 //断言(设置一个表达式,如果表达式为假则报错) assert(dest != NULL); //使用时要包含头文件 <assert.h> assert(src != NULL); //括号中存放我们期待的结果(表达式),一旦表达式为假就会报错 while (*src != '\0') //可以直接写成(*src),因为 \0 的ASCII码值为0,判定到0就跳出循环 { *dest = *src; //把对应位置的src的值赋给dest //两指针移至下一位 dest++; src++; } //当while循环到\0时,跳出循环,\0 还没有赋值给目标地址 //所以跳出循环后要再赋值一次,把 \0 赋给目标地址 *dest = *src; } int main() { char arr1[] = "hello bit"; char arr2[20] = "xxxxxxxxxxxxx"; //char* p = NULL; //断言测试 my_strcpy(arr2, arr1); printf("%s\n", arr2); //printf("%s\n", my_strcpy(arr2, arr1)); //模仿的 strcpy 会返回目标地址的首元素地址 return 0; }
(进行优化:)
//版本2: #include <stdio.h> #include <assert.h> //函数返回的是目标空间的起始地址 char* my_strcpy(char* dest, const char* src) //这里const放在*左边,限制了*src,但还可以使用src // const:使具有 常属性 , //修饰指针时: //当 const 放在 * 的左边时,限制的是 *p (指针指向内容),即 *p 不能被改变(不能通过指针变量改变指针的内容) // 但是 p 是可以改变的(指针变量的本身是可以改变的) //当 const 放在 * 的右边时,限制的是 p (指针变量本身),即 p (指针变量本身)不能被改变 // 但是 *p (指针内容)是可以通过指针来改变的 { char* ret = dest; //先把dest的首地址存起来,方便后面保存 //因为之后赋值后,dest会后移,就不是首地址了 //断言 assert(dest != NULL); assert(src != NULL); while (*dest++ = *src++) ; //空语句 //把赋值操作直接放在while的判定条件中 //例如:把src中的 h 赋给 dest,此时表达式判定结果为 h // h 的ASCII码值 不为0,所以循环继续 //当把 \0 赋给dest时,表达式结果为 0,停止循环 //此时即把 \0 赋值了过去,又停止了 循环 //使用后置++,先使用地址上的内容,再++,判定下一位 //*dest++:先执行 *dest 解引用,之后再执行 dest++ //直接把 while 的大括号给省了 return ret; } int main() { char arr1[] = "hello bit"; char arr2[20] = "xxxxxxxxxxxxx"; //char* p = NULL; //断言测试 //my_strcpy(arr2, arr1); //printf("%s\n", arr2); printf("%s\n", my_strcpy(arr2, arr1)); //模仿的 strcpy 会返回目标地址的首元素地址 //此时使用了 链式访问:一个函数的返回值 作为 另一个函数的返回值 return 0; }
知识点一:const
const:使具有 常属性 (“无法改变”)
const 修饰指针时
当 const 放在 * 的左边时,限制的是 *p (指针指向内容),即 *p不能被改变(不能通过指针变量改变指针的内容),但是 p 是可以改变的(指针变量的本身是可以改变的)
当 const 放在 * 的右边时,限制的是 p (指针变量本身),即 p (指针变量本身)不能被改变,但是 *p (指针内容)是可以通过指针来改变的
知识点二:使用断言 assert
知识点三:简化 字符串赋值流程
知识点四:链式访问