夜暗方显万颗星,灯明始见一缕尘。
5.如何写出好(易于调试)的代码
1)优秀的代码:
·代码运行正常
·bug很少
·效率高
·可读性高
·可维护性高
·注释清晰
·文档齐全
常见的coding(编程)技巧:
·使用assert
·尽量使用const
·养成良好的编码风格
·添加必要的注释
·避免编码的陷阱
2)示范:
模拟实现库函数:strcpy
(1)先了解strcpy的作用(功能)
·strcpy在拷贝字符串的时候,会把源字符串中的\0也拷贝过去
(2)实现strcpy
#include <stdio.h>
//模拟实现库函数:strcpy
void my_strcpy(char* dest,const char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
//把\0拷贝过来
*dest = *src;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxx";
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
(3)改进版本
#include <stdio.h>
void my_strcpy(char* dest, const char* src)
{
while (*dest++=*src++)//当赋值到\0(假)后退出循环
{
;
}
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxx";
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
如果源数据穿的是NULL,那么就不能使用,这里可以加上assert(断言)来判断
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* dest, const char* src)
{
//断言,头文件<assert.h>
assert(src != NULL);
while (*dest++=*src++)//当赋值到\0(假)后退出循环
{
;
}
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxx";
char arr2[] = "hello world";
char* p = NULL;
my_strcpy(arr1, p);
printf("%s\n", arr1);
return 0;
}
(在55行报错)
源数据传参的时候,在其前加上const的作用是:while循环内两个解引用的数据写反了时,编译器能够及时报错提醒
那么const的意思是什么?
·const修饰的时常变量,不可以改
但是有种情况可以改:
不想改的话,就在指针前面加const
const修饰指针变量:
·const放在*左边
(const int* p = #等价于int const* p = # )-->意思是p指向的对象不能通过p来改变,但是p变量本身的值是可以改变的
·const放在*的右边
(int* const p = #)-->意思是p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值