5. 如何写出好的(易于调试的代码)
常见技巧:
- 尽量使用assert
- 尽量使用 const
- 养成良好的编码习惯
- 添加必要的注释
实例二
【strcpy库函数的实现】
/*** *char *strcpy(dst, src) - copy one string over another * *Purpose: * Copies the string src into the spot specified by * dest; assumes enough room. * *Entry: * char * dst - string over which "src" is to be copied * const char * src - string to be copied over "dst" * *Exit: * The address of "dst" * *Exceptions: *******************************************************************************/ char * strcpy(char * dst, const char * src) { char * cp = dst; assert(dst && src); while( *cp++ = *src++ ) ; /* Copy src over dst */ return( dst ); }
仔细观察,这里库函数的第二个参数是被const修饰的。那么这里的const有什么作用呢?
const 的作用
#include <stdio.h> //代码1 void test1() { int n = 10; int m = 20; int *p = &n; *p = 20;//编译通过 p = &m; //编译通过 } void test2() { //代码2 int n = 10; int m = 20; const int* p = &n; *p = 20;//编译失败 p = &m; //编译通过 } void test3() { int n = 10; int m = 20; int *const p = &n; *p = 20; //编译通过 p = &m; //编译失败 } int main() { //测试无cosnt的 test1(); //测试const放在*的左边 test2(); //测试const放在*的右边 test3(); return 0; }
const修饰指针时:
- const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。
- const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
assert 的作用
assert的作用是:当程序运行时,若assert的括号中的条件不满足时,程序会强制提醒程序员。例如:
但是assert需要包含头文件:#include<assert.h>。
#include<stdio.h> #include<assert.h> int div1(int a, int b) { assert(0); int ret = a / b; return ret; } int main() { int a = 4; int b = 1; //scanf("%d %d", &a, &b); int ret = div1(a, b); printf("%d", ret); return 0; }
只要程序不满足assert括号中的语句,程序就会强制提醒用户出错的地方。
小练习:模拟实现strlen函数
#include<stdio.h> #include<assert.h> //模拟实现strlen函数 int MyStrlen(const char* arr) { assert(arr != NULL); int count = 0; while (*arr != '\0') { count++; arr++; } return count; } int main() { char arr[1000]; gets(arr);//读取字符串 int len = MyStrlen(arr); printf("%d \n", len); return 0; }
这里要注意assert的使用和 const的使用。
6. 编程常见错误
编译型错误:
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单.
链接型错误:
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。
运行时错误:
借助调试,逐步定位问题。最难搞。
所以,还是要靠我们做一个有心人,积累排错经验。
7.完结
本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!