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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • data gateway_交通运输部监测调度

    data gateway_交通运输部监测调度对于大数据场景,计算的业务逻辑基本都在数据处理过程中完成,最后往往会持久化下来计算的结果,存储在mysql,es,hbase等适合提供查询的地方。而对于在不同数据库上的数据,需要开发接口,管理接口也是一个不小的工作量。Dataway的出现,正好解决了这个场景下的接口开发,管理等问题。只需要通过SQL,Dataql等配置就能完成一个接口的上线,大大提高了开发效率,以及管理成本。对于数据中台建设中,Dataway可以使用在统一服务层,对接各种数据源,管理数据出口。一、安装引入依赖Da…

    2025年6月1日
    0
  • 关于maven项目打jar包运行main方法

    关于maven项目打jar包运行main方法因项目需要,在main方法中需读取spring配置文件,完成插入操作。然后打包成jar包,运行main方法。具体操作:main方法中读取spring文件:ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext(“spring-mybatis.xml”);要改成你自己的配置文件。Service…

    2022年6月19日
    113
  • 宽度优先搜索第n遍

    宽度优先搜索第n遍

    2021年9月27日
    34
  • 基于MQTTnet 3.0.12实现MQTT服务器和客户端「建议收藏」

    基于MQTTnet 3.0.12实现MQTT服务器和客户端「建议收藏」基于MQTTnet3.0.12实现MQTT服务器和客户端概述-可看可不看的废话MQTT是啥MQTTnet正文MQTTServer/Broker实现MQTTServer/Broker创建MQTTServer/Broker发布消息MQTTClient实现MQTTClient创建MQTTClient发布消息MQTTClien订阅消息MQTTClien取消订阅消息概述-可看可不看的废话公司基于制造业客户的数据采集需求,在布局自己的数据中台。现在物联网的概念很火,辣条从业7年来一直号称是“自动化

    2022年6月25日
    31
  • 磁盘,硬盘,软盘,光盘的区别[通俗易懂]

    磁盘,硬盘,软盘,光盘的区别[通俗易懂]计算机存储器分为两大类:内存存储器和外部存储器(简称内存或内存条和外存)。内存容量小,存取速度快,只能临时保存信息(经cup处理后的数据),断电后信息就会消失。外存容量大,存取速度比内存慢,能永久

    2022年8月3日
    3
  • centos7.0 web服务器搭建「建议收藏」

    centos7.0 web服务器搭建「建议收藏」centos7.0web服务器搭建前言按照先易后难排序,在vmware虚拟机环境下模拟,统一防火墙为Firewall,统一在xshell下操作终端实现搭建.(强烈建议新手安装选择带gui服务器这样终端操作可以复制,分析文件,熟系操作之后可以最小安装(如果没有桌面,用xshell连接操作终端比较方便),我就是进过这样的坑)关于搭建分为三步,第一步配置网络(非虚拟机…

    2022年5月28日
    38

发表回复

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

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