如何写出好(易于调试)的代码

优秀的代码:

1、代码运行正常

2、bug很少

3、效率高

4、可读性高

5、可维护性高

6、注释清晰

7、文档齐全

常见的coding技巧:

1、使用assert(断言)

2、尽量使用const

3、养成良好的编码风格

4、添加必要的注释

5、避免编码的陷阱

示例(模拟编写字符串复制函数):

使用assert(断言)

这是原先的代码:

//模拟实现strcpy
my_strcpy(char *dest,char *src){
	while (*dest++=*src++)
	{
		;//后置++先赋值再指针后移,依次复制hello,当循环到arr2的'\0'时,其ASCII值为0,判断为假,循环结束
	}
}

int main() {
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2); //1.目标空间的起始地址,2.源空间的起始地址
	printf("%s\n", arr1);
	return 0;
}

代码实现了我们的需求,但是当主函数传参时传入的是空指针(数组),my_strcpy函数运行会出现问题,因此我们可以在函数中加入assert(断言)语句,如下:

//模拟实现strcpy
my_strcpy(char *dest,char *src){
	assert(src != NULL);//断言
	assert(dest != NULL);
	while (*dest++=*src++)
	{
		;//后置++先赋值再指针后移,依次复制hello,当循环到arr2的'\0'时,其ASCII值为0,判断为假,循环结束
	}
}

int main() {
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1,NULL); //1.目标空间的起始地址,2.源空间的起始地址
	printf("%s\n", arr1);
	return 0;
}

运行结果如下图,会提醒我们哪一行的assert语句判断条件不满足:

如何写出好(易于调试)的代码_第1张图片


尽量使用const

const修饰变量,这个变量被称为常变量,不能被修改,但是本质上还是变量

还是刚才的例子,如果my_strcpy中的代码出现问题,使得dest的值复制到src中,而此时dest比src长,导致运行错误,如下:

//模拟实现strcpy
my_strcpy(char *dest,char *src){
	assert(src != NULL);//断言
	assert(dest != NULL);
	while (*src++=*dest++)
	{
		;//后置++先赋值再指针后移,依次复制hello,当循环到arr2的'\0'时,其ASCII值为0,判断为假,循环结束
	}
}

int main() {
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1,arr2); //1.目标空间的起始地址,2.源空间的起始地址
	printf("%s\n", arr1);
	return 0;
}

运行结果如下:

如何写出好(易于调试)的代码_第2张图片

 因此修改代码,将需要被复制的指针(数组)变量前加上一个const关键字修饰,防止其被修改,如下:

//模拟实现strcpy
my_strcpy(char *dest,const char *src){
	assert(src != NULL);//断言
	assert(dest != NULL);
	while (*src++=*dest++)
	{
		;//后置++先赋值再指针后移,依次复制hello,当循环到arr2的'\0'时,其ASCII值为0,判断为假,循环结束
	}
}

int main() {
	char arr1[20] = "xxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1,arr2); //1.目标空间的起始地址,2.源空间的起始地址
	printf("%s\n", arr1);
	return 0;
}

 此时再运行代码,会出现错误提示:

 

你可能感兴趣的:(C语言基础知识贴,c语言,开发语言,学习)