assert断言

1.assert断言介绍

1.使用方法

assert.h 头头件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就
错终止运行
。这个宏常常被称为“断言”

int main()
{
 int*p=NULL;
 if(p!=NULL)
 {
  *p=100;
 }

 return 0;
}

例如在以上代码中就可以用assert断言来替代if语句 

#include<assert.h>
int main()
{
 int*p=NULL;
 assert(p!=NULL)
 *p=100;

 return 0;
}

assert() 宏接受⼀个表达式作为参数。如果该表达式为(返回值非零), assert() 不会产生
任何作用
,程序继续运行。如果该表达式为(返回值为), assert() 就会报错,在标准错误流(屏幕上) stderr 中写入⼀条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号

真如以上所示,当assert后表达式为时候就会终止运行,并且给出报错信息提示,由此可见该程序错误行号为6

 2.无需更改代码开启或关闭 assert() 的机制

assert()对我们编写程序十十分友好的,不仅可以像以上一样把程序运行时出错的错误信息打印在屏幕上,其实还无需更改代码就可以开启或关闭assert()。

要实现这种效果这时就需要在已经确认程序没有bug时,无需assert()机制时在#include <assert.h> 语句的前面,定义一个宏 NDEBUG 

#define NDEBUG
#include<assert.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
		* p = 100;

	return 0;
}

正如以上程序,原本assert后表达式内容为假,运行程序本应该报错,但定义一个宏 NDEBUG 之后就不会显示出报错信息提示 其实定义一个宏 NDEBUG之后 编译器就会禁用文件中所有的 assert() 语句。

如果程序又出现问题,可以移除这条 #define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert() 语句。

在使用assrt时,程序因为引入了额外的检查,增加了程序的运行时间,所以一般我们只在调试版本中使用,而在发布版本版本中会将assert()机制关闭

而在vs中VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了assert

2.assert使用举例

strlen的模拟实现

库函数strlen的功能是求字符串长度,统计的是字符串中 \0 之前的字符的个数
了解之后我们就可以来模拟strlen的实现

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(char const* p)
{
	int count = 0;
	assert(p != NULL);
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%zd", my_strlen(arr));

	return 0;
}

运行程序结果如下 

 

在该代码中使用到了const在*左边可以防止数组arr内容被修改 ,提升了代码的鲁棒性,同时使用assert断言可以使指针p为空时报错

  • 66
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 47
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值