一、原型定义

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,

原型定义:

#include <assert.h>
void assert( int expression );

二、作用

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

请看下面的程序Untitled-1.c:

#include <stdio.h>
#include <assert.h>int main(int argc, char const *argv[])
{int i = 0;while (1){i++;printf("Before assert is %d.\n", i);assert(i <= 5);printf("After assert is %d.\n", i);  //当i>5时,不会执行到这一句}return 0;
}

运行结果如下:

Before assert is 1.
After assert is 1.
Before assert is 2.
After assert is 2.
Before assert is 3.
After assert is 3.
Before assert is 4.
After assert is 4.
Before assert is 5.
After assert is 5.
Before assert is 6.
Assertion failed!Program: C:\***\Desktop\Untitled-1.exe
File: Untitled-1.c, Line 13Expression: i <= 5

三、缺点

频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include <stdio.h>
#define NDEBUG
#include <assert.h>

四、用法总结与注意事项

1. 在函数开始处检验传入参数的合法性,如:

/*** 功能:改变缓冲区大小,* 参数:nNewSize 缓冲区新长度*/
int resetBufferSize(int nNewSize)
{assert(nNewSize >= 0);assert(nNewSize <= MAX_BUFFER_SIZE);...  //只有当参数nNewSize的值符合上面两个条件时,才会执行到这里
}

2. 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:

  • 不好:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
  • 好:
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

3. 不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

  • 错误:
assert(i++ < 100);

这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

  • 正确:
assert(i < 100);i++;

4. assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

5. 有的地方,assert不能代替条件过滤。


参考链接:https://www.cnblogs.com/cpoint/p/3367326.html

C语言中assert()函数的用法总结相关推荐

  1. C语言中assert函数的用法

    断言(ASSERT)的用法 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,asse ...

  2. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  3. C语言中atoi()函数的用法

    C语言中atoi()函数的用法 一.学习要点: 1.int atoi(const char *str)把参数str所指向的字符串转换为一个整数: 二.代码 #include<stdio.h> ...

  4. C语言中fscanf()函数的用法介绍

    C语言中fscanf()函数的用法介绍 fscan()函数的原型: int fscanf(FILE *stream,const char *format,[argument...]); fscanf函 ...

  5. c语言time函数的作用,c语言中time函数的用法

    c语言中time函数的用法 c语言中time函数的用法的用法你知道吗?下面应届毕业生小编就跟你们详细介绍下c语言中time函数的用法的用法,希望对你们有用. c语言中time函数的用法的用法如下: 头 ...

  6. c语言中fputc函数的作用是,C语言中fputc函数的用法

    C语言中fputc函数的用法 C语言中fputc函数的用法为"int fgetc (FILE *fp)",该函数的作用是从指定的文件中读取一个字符, 读取成功时会返回读取到的字符, ...

  7. c语言中fputc函数的作用是,C语言中fputc函数的用法_后端开发

    Python画ROC曲线和AUC值计算(附代码)_后端开发 ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器的优劣.这篇文章将先简单的 ...

  8. 关于C语言中getchar()函数的用法

    前言:ASCII码 ASCII码是现在通用的单字节编码系统,它使用7位或8位二进制数字的指定组合来表示128或256个可能的字符,其全称是美国信息交换标准代码.ASCII码对照表:ascii码对照表在 ...

  9. c语言中assert函数,assert()函数用法总结

    assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include void assert( int expression ); assert的作用是现计算表达式 ...

最新文章

  1. python版本控制神器Virtualenvwrapper的使用
  2. java List集合中contains方法总是返回false
  3. 奇奇怪怪的冒泡排序 TOJ 2014: Scramble Sort
  4. 测序发展史,150年的风雨历程 (第二版)
  5. 从“人脸”到“狗脸”,AI也要去宠物经济分杯羹?
  6. 按字符串长度切割字符串(支持汉字占2个长度)
  7. Spring Security实现登录权限控制,记住我等功能
  8. 树和而叉查找树的实现
  9. python游戏猫咪藏在哪个房间_tes体系风格已经定型,EZ加猫咪似乎成唯一解,在藏还是真没了?...
  10. C - Rencontre Gym - 102798C
  11. Post请求如何取消异步
  12. spring react_使用Spring WebFlux构建React性REST API –第3部分
  13. echars显示折点数据_Echarts 折线图一个点显示多个实时数据tooltip
  14. Hive设计和体系结构
  15. java tiff 压缩_使用Java ImageIO进行Tiff压缩
  16. 没网?没问题。用Air Gap使用Artifactory
  17. 关闭rhel 6.5的selinux
  18. linux内核分析与应用 -- 并发(上)
  19. js-showModalDialog和dialogArguments
  20. 佳博LabelShop模板文件转成佳博打印机指令软件

热门文章

  1. ps aux grep java_ps -aux | grep 用法详解
  2. HTML5期末大作业:游戏网站设计与实现——基于bootstrap响应式游戏资讯网站制作HTML+CSS+JavaScript...
  3. 阿里连接池报错:Failed to configure a DataSource ‘url‘ attribute is not specified and no embedd
  4. 广告岗位怎么使用数字员工省时省力
  5. 2017第八届蓝桥杯C/C++ B组省赛题解
  6. 6 如何写一个简单地标签
  7. 神武3手游哪个跨平台服务器最多人,《神武3》手游一个门派要“霸占”一个服务器?...
  8. 身在职场,让程序员跳槽的那些非钱原因!未来的路该怎么走?
  9. mac电脑的wifi图标不见了怎么调出来?
  10. 2007:我们怎样理财 有闲钱就炒黄金?