断言(assert)的用法

参考:https://www.runoob.com/w3cnote/c-assert.html

目录

    • 作用
    • 总结与注意事项
    • Demo

作用

assert 是个宏,并且作用并非"报错"。

assert() 的用法像是一种"契约式编程",程序满足我的假设条件,才能正常良好的运作,其实就相当于一个 if 语句:

if(假设成立)
{程序正常运行;
}
else
{报错&&终止程序!(避免由程序运行引起更大的错误)  
}

但是这样写的话,就会有无数个 if 语句,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了 assert()。

#include "assert.h" 
void assert( int expression );

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

使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:

#include 
#define NDEBUG 
#include

总结与注意事项

  • 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++; 

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

ASSERT 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略。

Demo

1)满足假设条件,正常运行:

在这里插入图片描述

在这里插入图片描述

2)不满足假设条件,先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 变量

插入 日期时间 循环插入 declaretotal date: trunc(sysdate-1) ;beginfor i_count in 1..10000 LOOPinsert into DQ_DATE(date_time) values ( total );total : total 1/24;end loop; end; 转载于:https://www.cnblogs.com/kingxiaozi/p/3790327.html

马云语录,非常值得一看(转)

来源:计算机网1999至今 在杭州设立研究开发中心&#xff0c;以香港为总部&#xff0c;创办阿里巴巴网站(Alibaba.com) 孙正义跟我有同一个观点&#xff0c;一个方案是一流的Idea加三流的实施&#xff1b;另外一个方案&#xff0c;一流的实施&#xff0c;三流的Idea&#xff0c;…

keepalived mysql双主架构图_基于keepalived Mysql双主热备配置

基于keepalived双主热备:一.环境:OS:CentOS 6.5 X64DB Version:Percona Mysql 5.7.15-9-log路径:/app/mysql57数据文件路径:/data/mysql57/dataDB1:192.168.213.4DB2:192.168.213.5二.安装keepalived包(两台主机都需操作)1.下载keepalived包cd /usr/local/toolswget http://www…

centos7 docker安装和使用_入门教程

centos7 docker安装和使用_入门教程 原文:centos7 docker安装和使用_入门教程说明&#xff1a;本文也是参考互联网上的文章写的&#xff0c;感谢相关作者的贡献。 操作系统 64位CentOS Linux release 7.2.1511 (Core) 配置好IP&#xff1a;192.168.1.160 修改yum源 目的是提升对…

公钥、私钥、数字签名和数字证书

参考:公钥、私钥、数字签名和数字证书的概念及解密 地址:https://blog.csdn.net/oscar999/article/details/123489420 作者:oscar999 目录 概念解析https 的非对称加密和对称加密如何产生密钥和证书使用keytool 产生公私钥到一个密钥库文件中从密钥库文件导出证书openssl 将…

curl命令具体解释

对于windows用户假设用Cygwin模拟unix环境的话&#xff0c;里面没有带curl命令&#xff0c;要自己装&#xff0c;所以建议用Gow来模拟&#xff0c;它已经自带了curl工具&#xff0c;安装后直接在cmd环境中用curl命令就可&#xff0c;由于路径已经自己主动给你配置好了。 linux …

[转] SQL2000 关于 Java JDBC 驱动的安装和设定

1、首先要记得sql2000 要打上sp3以上的补丁.(建议用sp4)2、装上SQL Server 2000 Driver for JDBC Service Pack 3下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId07287B11-0502-461A-B138-2AA54BFDC03A&displaylangen3、安装完SQL Server 2000 Driver…

wxpython 可视化开发pdf_MicroPython for the Internet of Things.pdf

标签&#xff1a;MicroPythonMicroPythonPythonPythonIoTiot是Internet Of Things的缩写&#xff0c;字面翻译是“物体组成的因特网”&#xff0c;准确的翻译应该为“物联网”。物联网(Internet Of Things)又称传感网&#xff0c;简要讲就是互联网从人向物的延伸。“物联网”(I…

PAT A1149 Dangerous Goods Packaging (25 分)——set查找

When shipping goods with containers, we have to be careful not to pack some incompatible goods into the same container, or we might get ourselves in serious trouble. For example, oxidizing agent &#xff08;氧化剂&#xff09; must not be packed with flamma…

C语言中字符串和字符数组的区别

参考&#xff1a;C语言中字符串和字符数组的区别 参考&#xff1a;字符数组和字符串的区别&#xff0c;C语言字符数组和字符串区别详解 这里写目录标题区别代码分析一代码分析二总结区别 &#xff08;1&#xff09;C语言中&#xff0c;没有字符串类型但可以用字符数组模拟字符…

spring in action 读书笔记

IOC 1.几个主要使用的application context. ClassPathXmlApplicationContext 从ClassPath路径加载 FileSystemXmlApplicationContext 从文件系统路径加载XmlWebApplicationContext 配置文件黑夜在/WEB-INF/applicationContext.xml&#xff0c;也可以使用setConfigLocation…

x64 stack walking、调用约定、函数参数识别

k <rsp> <rip> <frame_count>x64下manual stack walking与x86不同&#xff0c;x86一般情况下有ebp chain&#xff0c;x64没有ebp chain&#xff0c;类似x86的FPOx64下&#xff0c;rsp在函数执行完prologue之后就不会变化(调用约定)&#xff1b;所以0.如果函…

项目中的加减法--《最后期限》读书笔记(1)

题记&#xff1a;最近重读《最后期限》&#xff0c;有了不少的感触&#xff0c;上次读这本书还是大学的时候呢&#xff0c;看来有些东西只有当实际做过了用过了&#xff0c;才会明白起来&#xff0c;做多了用多了&#xff0c;才会真的明白。好多东西还是无法一时接受&#xff0…

全国python一级考试时间_2019年北京全国计算机一级考试时间

考试方式与日期NCRE采用无纸化上机考试。北京考试日期为2019年3月30日至4月1日。考生具体考试日期时间和考场地点&#xff0c;由考务系统编排考场时随机确定。考前10天考生可登录报名网站查看、打印准考证。考试具体日期时间、地点均以《准考证》为准&#xff0c;不得更改。五、…

C语言可变参数

参考&#xff1a;https://blog.csdn.net/u013171226/article/details/121445507 目录什么是可变参数可变参数列表构成实现原理(va_list系列变参宏实现变参函数)代码示例函数通过固定参数指定可变参数个数&#xff0c;打印所有变参值函数定义一个结束标记(-1)&#xff0c;调用时…

Linux-Android 修改屏蔽长按键功能

这段时间发现,如果手动一直按住设备的物理按键,APP中的EditText会一直输入字符,这样很不方便,如果使用者随后按一下按键,就会看到EditText中输入了几个字符,肯定不舒服,多输入的还需要手工在删除,麻烦!可以进行如下修改: <1> : 首先要保证linux driver不能够在按下时一直…

[Swift]LeetCode556. 下一个更大元素 III | Next Greater Element III

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

940mx黑苹果驱动_超详细黑苹果安装图文教程送EFI配置合集及系统

一、准备工作所有工具在&#xff1a;黑苹果资源站可以下载到 网站地址&#xff1a;https://jnzr.ewys.net/1、两张16g的u盘 其中一张安装pe系统 (老毛桃等)这里自行安装2、电脑(废话)这里以小米pro笔记本做教程 其余的本本大同小异3、工具包及镜像以及EFI合集(链接及下载地址在…

html中name和id的区别 [ZT]

nameid 一个microsoft的 一个是netscape的 都是标记对象名称 --------------------------------------------------------------- 表单元素(form input textarea select)与框架元素(iframe frame)用 name 这些元素都与表单(框架元素作用于form的target)提交有关, 在…

python时间减法_干!一张图整理了 Python 所有内置异常

在编写程序时&#xff0c;可能会经常报出一些异常&#xff0c;很大一方面原因是自己的疏忽大意导致程序给出错误信息&#xff0c;另一方面是因为有些异常是程序运行时不可避免的&#xff0c;比如在爬虫时可能有几个网页的结构不一致&#xff0c;这时两种结构的网页用同一套代码…