目录
6. 如何写出好(易于调试)的代码
6.1 优秀的代码:
1. 代码运行正常
2. bug很少
3. 效率高
4. 可读性高
5. 可维护性高
6. 注释清晰
7. 文档齐全
常见的coding技巧:
1. 使用assert
2. 尽量使用const
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱。
6.2 示范(模拟实现strcpy)
模拟实现strcpy
可以在cpluscplus里面查看strcpy函数
//void my_strcpy(char* dest, char* src)
//{
// while (*src!='\0')
// {
// *dest = *src;
// dest++;
// src++;
// }
// *dest = *src;
//}
//void my_strcpy(char* dest, char* src)
//{
// while (*dest++ = *src++)
// {
// ;
// }
//}
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
//断言
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
return dest;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxxx";
char arr2[] = "hello world";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
函数strcpy返回的是目标空间的起始地址
6.3 const的作用
//const修饰变量的时候,是在语法层面限制了const被修改
//但本质上,num还是变量,是一种不能被修改的变量
int main()
{
const int num = 10;
printf("num = %d\n", num);
//num = 20;
//const放在*的左边
// 限制的是指针指向的内容(*p),也就是说不能通过指针来修改指针指向的内容
// 但是指针变量是可以修改的,也就是说指针可以指向其他变量的
//
//const放在*的右边
// 限制的是指针变量本身(p),指针变量不能再指向其他对象
// 但是可以通过指针变量来修改指向的内容
//int* p = #
//const int* p = #
//int* const p = #
const int* const p = #
*p = 20;
int n = 1000;
p = &n;//ok
printf("num = %d", num);
return 0;
}
结论:
const修饰指针变量的时候:
1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改
变。但是指针变量本身的内容可变。
2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指
针指向的内容,可以通过指针改变。
6.3.1.模拟实现一个strlen函数
size_t my_strlen(const char* str)
{
assert(str);
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
7. 编程常见的错误
7.1 编译型错误
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
7.2 链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不 存在或者拼写错误。
7.3 运行时错误
借助调试,逐步定位问题。最难搞。