c语言中的assert函数_assert函数用法

c语言中的assert函数_assert函数用法一、 简介assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。原型定义:#include <assert.h>void assert( int expression );assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、 简介

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

原型定义:

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

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

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{ 
   
       FILE *fp;
    
       fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
       assert( fp );                           //所以这里不会出错
       fclose( fp );
    
       fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
       assert( fp );                           //所以这里出错
       fclose( fp );                           //程序永远都执行不到这里来
       return 0;
}

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

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

二、 用法总结与注意事项:

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


int resetBufferSize(int nNewSize)
{ 
   
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
  //返回值:缓冲区当前长度 
  //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}

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不能代替条件过滤。

assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。

一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。


如果ASSERT()中的条件不成立(比如 ASSERT(0) ; ),会弹出一个比较吓人的对话框。
点击重试,可以到达 ASSERT 断言不成立的那一行,
此时可以在watch窗口查看变量值,找出出错的原因。
如果程序能够继续运行,可以按F5继续调试。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170924.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 散列/散列函数「建议收藏」

    散列/散列函数「建议收藏」散列是一种用于以常数平均时间执行插入、删除和查找的技术。每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数我认为,先用散列函数将我们所要进行操作的集合整合成散列表,是对之后的操作的一种便利。放到实际中去,我们要进行操作的集合不仅仅只是数字,例如图书馆中的书籍分类等等。而且就算是一组不连续差距较大的数字,要执行后序的插入删除和查找都是很不方

    2022年5月15日
  • HttpCanary下载_Http是

    HttpCanary下载_Http是前言首先,我们无论学习哪个框架,都要带着问题,带着思考去学习思考1:HttpRunner是什么?思考2:HttpRunner的设计模式是什么?思考3:为什么我们要学习HttpRunner?他的

    2022年7月29日
  • SQL Server 2019下载及安装教程

    文章目录一、安装SQLServer2019二、安装SQLServerManagementStudio(SSMS)一、安装SQLServer2019搜索SQL,点击红色部分跳出一下界面,随便填,填完之后,点击continue。点击保存,保存成功之后,打开文件夹,右键以管理员身份启动,就会看见下面的画面,我这边选择的是自定义安装。弹出的选项,一个是中文,媒…

    2022年4月7日
  • win10修改视频默认播放器_win10无法更改默认播放器

    win10修改视频默认播放器_win10无法更改默认播放器你要用到WindowsPowerShell,它是win10系统自带的一个应用,要打开它,就单击开始菜单中的“所有应用”,然后找到WindowsPowerShell的文件夹,右键单击WindowsPowerShell(注意不是WindowsPowerShellISE),然后单击以管理员身份运行,就打开了。输入以下:get-appxpackage*zunevideo*|r

    2022年9月1日
  • php一句话木马中的@有什么用

    php一句话木马中的@有什么用<?php@eval($_POST[‘attack’])?>@表示后面即使执行错误,也不报错eval()函数表示括号内的语句字符串什么的全都当做代码执行$_POST[‘attack’]表示从页面中获得attack这个参数值只要攻击者满足这三条添加,就能实现入侵:(1)木马上传成功,未被杀;(2)知道木马的路径在哪;(3)上传的木马能正常运行。…

    2022年5月11日
  • Python小白的10个常犯错误,你还在这样操作吗?

    Python小白的10个常犯错误,你还在这样操作吗?

    2021年7月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号