【一段代码可以进行哪些优化?】

前言

对于刚开始写代码的同学,我们想的仅仅是能将代码敲出来,运行没有问题就足够了,但是随着学习的深入我们也应该对自己的代码质量进行思考,今天我们就来探讨一下学C语言的同学都编写过的一段代码可以进行哪些地方的优化:

题目:自己编写程序实现strcpy函数的功能

#include<stdio.h>
void MY_strcpy(char* arr1, char* arr2)
{
	while (*arr2!='\0')
	{
		*arr1 = *arr2;//将arr2里面的元素赋值给arr1
		arr1++;//因为数组中元素的地址是连续的,找到arr1中下一个元素
		arr2++;//找到arr2中的下一个元素
	}
	*arr1 = *arr2;//将arr2中的'\0'赋值给arr1
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] = "hello";
	MY_strcpy(arr1, arr2);//将arr1和arr2的首元素地址传过去
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

这是我第一次编写实现strcpy的函数代码,也相信大家都是这样编写的吧,当时我看到运行成功就自以为我成功了,但是现在看起来这段代码是不是很挫,那让我们开始进行优化吧!

**①:***arr1 = *arr2;
arr1++;
arr2++;
这里是不是有点累赘了,那我们就把他们改进一下:

#include<stdio.h>
void MY_strcpy(char* arr1, char* arr2)
{
	while (*arr2!='\0')
	{
		*arr1 ++= *arr2++;//因为这里是后置++,先解引用赋值,在++
		
	}
	*arr1 = *arr2;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] = "hello";
	MY_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

**②:**这段代码就比上面的简洁很多,但是这还不是最简,我们知道arr2数组中的结束标志为‘\0’,而’\0’的ASCII的值为48,就是0,而且while的循环条件就是0或者非0,因此如果我们把这两个想法结合在一起:

#include<stdio.h>
void MY_strcpy(char* arr1, char* arr2)
{
	while (*arr1++=*arr2++)//、赋值表达是的运算结果为赋给左边的值,当arr2索引到0的时候赋给了arr1,而此时赋值表达式的值也为0
	{
		;
	}
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] = "hello";
	MY_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

**③:**优化代码不仅要从代码的简洁程度上去实现,还应该注重代码可能会出现的问题,试想一下,如果我们把空指针赋值过去上面的代码还可以实现吗

#include<stdio.h>
void MY_strcpy(char* arr1, char* arr2)
{
	while (*arr1++=*arr2++)
	{
		;
	}
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] ="hello";
	MY_strcpy(arr1, NULL);
	printf("%s\n", arr1);
	return 0;
}
:这段代码运行挂了,因为我们学过了野指针知道将实参NULL传给形参arr2,arr2是个指针,但我们却对arr2进行了解引用操作:所以在程序运行的时候应该进行判断操作:【代码实现】:

#include<stdio.h>
void MY_strcpy(char* arr1, char* arr2)
{
	if (arr1 != NULL && arr2 != NULL)
	{
		while (*arr1++ = *arr2++)
		{
			;
		}
	}
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] ="hello";
	MY_strcpy(arr1, NULL);
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

:这里并没有将arr2的值赋值到arr1里面,因为arr2是空指针,所以没有进行交换,但是这只是将这一种情况给避免了,如果出现野指针的情况能给我们提醒就会将代码进行了优化【代码实现】:

#include<stdio.h>
#include<assert.h>
void MY_strcpy(char* arr1, char* arr2)
{
	assert(arr1!= NULL);
	assert(arr2 != NULL);
	while (*arr1++ = *arr2++)
	{
		;
	}
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] ="hello";
	MY_strcpy(arr1, NULL);
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

**⑤:**利用assert断言(原文地址:https://www.cnblogs.com/thisway/p/5558914.html)(assert函数的知识参考该文章)就可以向我们提醒,很大程度上提高了代码的质量,但是想要最大程度的实现该函数的功能,我们应该充分了解strcpy函数本身:
在这里插入图片描述

这是我截取关于strcpy函数的部分图片,在这里我们又可以看出两点:①:const修饰 ②:char*函数要返回arr1的地址,下面我们就从这两点接着将代码进行优化:

⑤-①:要利const我们就要知道const的用法:http://t.csdn.cn/P9rTy(const修饰指针的知识参考该文章)
⑤-②:在strcpy中的返回值是char*,那我们能不能也把我们的代码的返回值修改为char*【代码实现】:

#include<stdio.h>
#include<assert.h>
char* MY_strcpy(char* arr1, const char* arr2)
{
	char* ret = arr1;
	assert(arr1 != NULL);
	assert(arr2 != NULL);
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] ="hello";
	MY_strcpy(arr1, arr2);
	printf("%s\n", MY_strcpy(arr1, arr2));
	return 0;
}

总结

以上就是对代码逐步优化的过程,我们对此可以做出总结:
对代码的优化我们首先考虑的就是①:代码的简洁性,好的代码不要出现太多累赘,以及重复的部
②:我们应该从可能出现的问题入手,假设出现这种问题如何解决
③:学会对文档的学习,不断获取知识提高自己的见解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值