我们在编写一段代码时,往往会有许多不可避免的bug出现。这时如何快速地找出并修改这些bug就变得至关重要,本期我们将介绍一些在调试中使我们的代码变得更健全与完善的一些小技巧。
本期主要介绍assert与const的使用技巧
- assert的使用技巧
断言(assertion)是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果--当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。
断言是一种编程中常用的手段。在通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况。比如一个函数总需要输入在一定的范围内的参数,那么程序员就可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱。
从一些意义上讲,断言并不是正常程序所必需的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。
下面我来举几个具体的使用场景:
<模拟实现库函数strcpy>
#include
void my_strcpy(char* dest,char* src)
{
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
int main()
{
//strcpy-->字符串拷贝
char arr1[]="################";
char arr2[]="bit";
my_strcpy(arr2,arr1);
printf("%s\\n",arr1);
return 0;
}
如此,我们就成功地完成了任务,但我们如果用到今天提到的“assert”,则会使我们的代码更加健全,不容易在发生错误的情况下使程序崩溃。
下面来看改进版:
void my_strcpy(char* dest,char* src)
{
assert(dest != NULL);//断言
assert(src != NULL);//断言
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
以上改进版的函数的优势就在于当我们出现传参错误(例如将空指针NULL传入函数)时,系统就会自动报错而不是运行错误甚至崩溃。
当然,上述代码还有很多值得改动和优化的地方,我们后续会集中介绍。
- const的使用技巧
const是一个修饰符,它可以一个变量转换为常量,且无法修改。
下面我们用相同的例子来解释const的使用方法
#include
void my_strcpy(char* dest,char* src)
{
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
这是我们刚才所写的函数,但在我们函数的具体使用过程中如果将源头数组与目标数组弄混,程序运行就会错误且不易被察觉。这时我们如果使用const 修饰一下源头数组,再出现以上错误系统就会自动报错,从而使错误被发现。使用如下:
#include
void my_strcpy(char* dest,const char* src)//注意此处const
{
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
这样,当我们传参错误导致源头数组被更改时,系统就会自动提示我们代码出现问题了。
值得一提的是虽然用const 修饰的变量理论上无法被更改,但实际上我们仍可以通过对该变量的地址解引用来实现对此变量的更改:
int main ()
{
const int num=10;//虽然无法直接改变num的值
int* p=#
*p=20;//但可以通过此方式来更改
}
实际上此操作并不合法,如果我们不想让num通过地址被改变,我们也可以用const来修饰 “int* p” ,从而使*p(也就是num)无
-
逻辑
+关注
关注
2文章
832浏览量
29446 -
程序
+关注
关注
116文章
3776浏览量
80848 -
断言
+关注
关注
0文章
8浏览量
6683
发布评论请先 登录
相关推荐
评论