大家好,我们Brant_zero,很久没更新了。
今天给大家带来一篇C语言初级提高代码质量的文章,大家看完觉得不错可以点个赞,求求。
目录
了解并使用assert、const
1.正确使用assert
assert是什么呢,这里肯定有一些人产生了疑问,这里我们拿出MSDN中的介绍来看看
这里发现,assert是用来判断结果是否为假的,是假的就将错误信息打印出来。
这就很方便我们在写代码的时候判断一些语句的真假了,避免一些我们不希望产生的结果,并且告知我们错误。那这里我们来举一个strcpy函数的例子:
我们都知道strcpy是拷贝一个字符串到另外一个字符串,而如果字符串的起始位置是一个无效的地址,比如NULL地址,这是我们不想看到的情况,这里我们就可以使用assert断言一下,让两个字符串的起始地址都不能是NULL指针。
#include<assert.h>
int main ()
{
char arr1[10]="abcd";
char *p=arr1;
char *p1=NULL;
assert(p);
assert(p1);
return 0;
}
这样就可以避免p和p1如果是NULL指针的情况,当然上例的p也不可能是NULL指针,而是空指针的p1就会被assert判断为假,起到保险的作用,并且报告出错误的行数等等。
这里再拿出一个例子,如果const断言的是false会出现什么情况:
提醒的非常到位,还告诉了我们错误的行数,当然大家不要忘记引assert的头文件:
#include <assert.h>
2.const的作用:
如果变量或指针被const修饰,这个变量或指针便不能修改。
比如const修饰变量:const int a=20;
那么如果后面你要将a的值改动,这编译器便会开始报错.const修饰的变量不能被修改。
这里重点讲解一下const修饰指针:
const int *p=&a;
int *const p=&a;
const int *const p=&a;
这虽然只是挪动了const的位置,但是表示的意义却是非常不同的。
1. const int *p=&a; 的意义:
即p=&b;(可以) *p=30;(错误)
这里的const放在*的左边,修饰的是指针指向的目标。这里大家可以记忆为,const定死了*p,但是没有定死p。
但是我们可以改变p的指向,这样*p的值也就不同了。
只是不能直接通过*p=20这种方式来改变p指向内容的值。
你看,编译器直接报错了。
2.int *const p=&a;的意义:
即*p=30;(可以) p=&b;(错误)
这里const便修饰的是指针本身。
可以巧记为:const定死了指针p,但是*p没有被const定死。
44行语句便报了错,但是46行的没有。
这样的方式便可以改变*p的值,但是不能改变p的指向。
3.而第三种就简单了,两种都不能改,被const修饰死了,就是啥方式都不能改;
assert、const在函数中的使用
这里我们举例strcpy函数。
我们知道,strcpy函数是有一个目标地址和一个起源地址。
我们要改变的目标地址指向目标的值,而我们不希望起源地址指向目标的值被修改,这样我们便可以用const来修饰*p,防止BUG的产生,即使产生,也会报错,便于我们发现。
而assert函数可以帮我们避免两个指针是空指针,这样就可以避免用户不小心传进来空指针,导致程序错误。
这里放上我写的