当前位置: 首页 > news >正文

C语言assert函数:什么是“assert”函数

我一直在学习 OpenCV 教程,遇到了assert函数;它做什么?

assert将终止程序(通常带有引用 assert 语句的消息),如果其参数为 false。它通常在调试过程中使用,以使程序在发生意外情况时更明显地失败。

例如:

assert(length >= 0);  // die if length is negative.

如果失败,您还可以添加要显示的更多信息:

assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");

或者像这样:

assert(("Length can't possibly be negative! Tell jsmith", length >= 0));

当您进行发布(非调试)构建时,您还可以通过定义NDEBUG宏来消除评估assert语句的开销,通常使用编译器开关。

// BAD
assert(x++);
// GOOD
assert(x);    
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);

从程序调用 abort()和不保证做任何事情的组合来看,断言应该只用于测试开发人员假设的事情,而不是例如用户输入数字而不是字母(应该通过其他方式处理)。

assert计算机语句类似于英文语句make sure

看看

assert() example program in C++

许多编译器提供了一个 assert () 宏。如果其参数评估为 TRUE,则 assert () 宏返回 TRUE,如果评估为 FALSE,则采取某种操作。许多编译器会在失败的 assert () 上中止程序;其他人会抛出异常

assert()宏的一个强大功能是,如果未定义 DEBUG,预处理器将其折叠成完全没有代码。在开发过程中,这是一个很大的帮助,当最终产品发布时,没有性能损失,也没有增加程序的可执行版本的大小。

Eg

#include <stdio.h>
#include <assert.h>
void yze (char *, int);
int main(void)
{char *string = "ABC";int length = 3;yze(string, length);printf("The string %s is not null or empty, ""and has length %d \n", string, length);
}
void yze(char *string, int length)
{assert(string != NULL);     /* cannot be NULL */assert(*string != '\0');    /* cannot be empty */assert(length > 0);         /* must be positive */
}
/****************  Output should be similar to  ******************
The string ABC is not null or empty, and has length 3

assert () 函数可以诊断程序 bug,在 C 中,它是在<assert.h>中定义的,在 C++ 中,它是在<cassert>中定义的,它的原型是

void assert(int expression);

参数表达式可以是任何你想测试的东西 — — 一个变量或任何 C 表达式。如果 expression 的计算结果为 TRUE,assert () 什么也不做。如果 expression 的计算结果为 FALSE,assert () 在 stderr 上显示错误消息并中止程序执行。

您如何使用 assert()?它最常用于跟踪程序错误(与编译错误不同)。错误不会阻止程序编译,但会导致程序给出错误的结果或运行不当(例如,锁定)。例如,您正在编写的财务分析程序可能偶尔会给出错误的答案。您怀疑问题是由变量 interest_rate 在负值上引起的。

assert (interest_rate & gt;= 0);在程序中使用 interest_rate 的位置。如果变量变为负数,则 assert () 宏会向您发出警报。然后,您可以检查相关代码以查找问题的原因。

要查看 assert () 的工作原理,请运行下面的示例程序。如果输入非零值,程序将显示该值并正常终止。如果输入零,assert () 宏将强制异常程序终止。您看到的确切错误消息将取决于您的编译器,但这是一个典型示例:

断言失败:x,文件 list19_3.c,第 13 行注意,为了使 assert()工作,您的程序必须在调试模式下编译。有关启用调试模式的信息,请参阅编译器文档(稍后说明)。当您稍后在发布模式下编译最终版本时,将禁用 assert()宏。

 int x;printf("\nEnter an integer value: ");scanf("%d", &x);assert(x >= 0);printf("You entered %d.\n", x);return(0);

输入整数值:10

你输入了 10。

输入整数值:-1

错误信息:程序异常终止

您的错误消息可能会有所不同,具体取决于您的系统和编译器,但总体思路是相同的。

相关文章:

C语言assert函数:什么是“assert”函数

我一直在学习 OpenCV 教程&#xff0c;遇到了assert函数;它做什么&#xff1f; assert将终止程序&#xff08;通常带有引用 assert 语句的消息&#xff09;&#xff0c;如果其参数为 false。它通常在调试过程中使用&#xff0c;以使程序在发生意外情况时更明显地失败。 例如&…...

R语言绘图-5-条形图(修改坐标轴以及图例等)

0. 说明&#xff1a; 1. 绘制条形图&#xff1b; 2. 添加文本并调整位置&#xff1b; 3. 调整x轴刻度的字体、角度及颜色&#xff1b; 4. 在导出pdf时&#xff0c;如果没有字体&#xff0c;该怎么解决问题&#xff1b; 1. 结果&#xff1a; 2. 代码&#xff1a; library(ggp…...

uniapp自定义权限菜单,动态tabbar

已封装为组件&#xff0c;亲测4个菜单项目可以切换&#xff0c; 以下为示例&#xff0c;根据Storage 中 userType 的 值&#xff0c;判断权限菜单 <template><view class"tab-bar pb10"><view class"tabli" v-for"(tab, index) in ta…...

ubuntu20.04配置解压版mysql5.7

目录 1.创建mysql 用户组和用户2.下载 MySQL 5.7 解压版3.解压 MySQL 文件4.将 MySQL 移动到适当的目录5.更改mysql目录所属的用户组和用户&#xff0c;以及权限6.进入mysql/bin/目录&#xff0c;安装初始化7.编辑/etc/mysql/my.cnf配置文件8.启动 MySQL 服务&#xff1a;9.建立…...

【js】vue获取document.getElementById(a)为null

需求 在菜单A页面点击某个元素携带id跳转到B详情页面&#xff0c;B页面获取该id元素的offsetTop, 并自动滚动到该元素处 问题 跳转到B详情页面, 在mounted获取到document.getElementById(a)为null, 因为整个详情页面是从后端获取来渲染的数据, 因此此时dom元素还未渲染出来,…...

系列六、Mybatis的一级缓存

一、概述 Mybatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xff09;&#xff0c; 第二次执行相同的查询时&#xff0c;会…...

用中文编程工具给澳大利亚客户定制开发的英文版服装进销存软件应用实例

用中文编程工具给澳大利亚客户定制开发的英文版服装进销存软件应用实例 软件从2016年一直用到现在&#xff0c;而且开的分店也是安装的这个软件&#xff0c;上图是定制打印的格式。 该编程工具不但可以连接硬件&#xff0c;而且可以开发大型的软件。 编程系统化课程总目录及明…...

geoserver 的跨域问题怎么解决

文章目录 问题分析问题 geoserver 发生跨域问题报错 分析 要解决 GeoServer 的跨域问题,可以通过配置 GeoServer 的 web.xml 文件来启用跨域资源共享(CORS)。以下是一些简单的步骤来实现这一点: 找到 GeoServer 的安装目录下的 webapps/geoserver/WEB-INF 文件夹。在该文…...

SQL语法实践(一)

文章 原文链接 实践 CREATE TABLE friend(fid INT NOT NULL,NAME VARCHAR(10) NOT NULL,age INT NOT NULL,adress VARCHAR(10) )SHOW TABLES; SELECT * FROM friend; SELECT fid,NAME FROM friend;INSERT INTO friend VALUES(1,Jack,18,Tianjing); INSERT INTO friend VALUE…...

路由器如何设置IP地址

IP地址是计算机网络中的关键元素&#xff0c;用于标识和定位设备和主机。在家庭或办公室网络中&#xff0c;路由器起到了连接内部设备和外部互联网的关键作用。为了使网络正常运行&#xff0c;需要正确设置路由器的IP地址。本文将介绍如何设置路由器的IP地址&#xff0c;以确保…...

自动驾驶算法(一):Dijkstra算法讲解与代码实现

目录 0 本节关键词&#xff1a;栅格地图、算法、路径规划 1 Dijkstra算法详解 2 Dijkstra代码详解 0 本节关键词&#xff1a;栅格地图、算法、路径规划 1 Dijkstra算法详解 用于图中寻找最短路径。节点是地点&#xff0c;边是权重。 从起点开始逐步扩展&#xff0c;每一步为一…...

MS5910PA为行业内领先的可配置10bit到16bit分辨率的旋变数字转换器,可替代AD2S1210

MS5910PA 是一款可配置 10bit 到 16bit 分辨率的旋 变数字转换器。片上集成正弦波激励电路&#xff0c;正弦和余弦 允许输入峰峰值幅度为 2.3V 到 4.0V &#xff0c;频率范围为 2kHz 至 20kHz 。 转换器可并行或串行输出角度和速度对应的 数字量。 MS5910PA 采…...

Random指定随机种子遇到的坑

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言指定随机种子出现的问题&#xff1f;总结 前言 业务中&#xff0c;之前有一个抽奖的需求&#xff0c;之初想让固定的奖品和玩家绑定一个固定的池子&#xff0c…...

2023云栖大会:属于开发者的狂欢

就在10月31日这天&#xff0c;杭州云栖小镇热闹非凡&#xff0c;第八届云栖大会在杭州云栖小镇盛大举行。这次大会以“聚焦大模型与生成式AI”为主题&#xff0c;开发者们齐聚一堂&#xff0c;共同探讨前沿技术趋势&#xff0c;以及如何将这些技术应用到实际业务场景中。 当然…...

jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目

选题目的 本设计课题为网上订餐系统设计与实现&#xff0c;提供无纸化点餐、支付&#xff0c;实现点餐快捷&#xff0c;方便管理。餐厅电子化是目前的潮流和趋势&#xff0c;大多数企业都将公司内部运营流程电子化。网上订餐管理系统应运而生&#xff0c;能够有效提高公司的管…...

优化大表分页查询性能:大表LIMIT 1000000, 10该怎么优化?

在处理大数据量的MySQL表时&#xff0c;我们经常会遇到一个问题&#xff1a;当我们尝试使用LIMIT语句进行分页查询时&#xff0c;性能会随着偏移量的增加而显著下降。例如&#xff0c;SELECT * FROM table LIMIT 1000000, 10 这样的查询可能会非常慢。那么&#xff0c;我们应该…...

ubuntu PX4 vscode stlink debug设置

硬件 stlink holybro debug板 pixhawk4 安装openocd 官方文档&#xff0c;但是第一步安装建议从源码安装&#xff0c;bug少很多 github链接 编译安装&#xff0c;参考 ./bootstrap (when building from the git repository)./configure [options]makesudo make install安装后…...

Flask的一种启动方式和三种托管方式

1. 原生启动 Flask 支持使用原生的 app.run() 方法来启动应用程序。这种方法是最简单、最基本的启动方式&#xff0c;适用于开发环境和小型应用程序。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__…...

cudnn too short

原因是libcudnn.so为软链接&#xff0c;相当于快捷键&#xff0c;但是没有映射到真正的libcudnn.so.8.9.5上 cd /usr/local/cuda-11.6/lib64 ln -s libcudnn.so.8.9.5 libcudnn.so.8...

01、SpringBoot + MyBaits-Plus 集成微信支付 -->项目搭建

目录 SpringBoot MyBaits-Plus 集成微信支付 之 项目搭建1、创建boot项目2、引入Swagger作用&#xff1a;2-1、引入依赖2-2、写配置文件进行测试2-3、访问Swagger页面2-4、注解优化显示 3、定义统一结果作用&#xff1a;3-1、引入lombok依赖3-2、写个统一结果的类-->RR类的…...

PDF怎么转Word不变形?2026保留原排版方法与软件推荐

PDF转Word时遇到排版错乱是许多办公人士的共同困扰。无论是报告、合同还是设计稿&#xff0c;排版混乱往往意味着需要重新手工调整&#xff0c;浪费大量时间。本文整合了2026年最实用的PDF转Word保留原排版方法&#xff0c;以及各类软件工具的详细对比&#xff0c;帮助你快速找…...

终极Android动漫播放器插件:Hanime1Plugin完全使用指南

终极Android动漫播放器插件&#xff1a;Hanime1Plugin完全使用指南 【免费下载链接】Hanime1Plugin Android插件(https://hanime1.me) (NSFW) 项目地址: https://gitcode.com/gh_mirrors/ha/Hanime1Plugin 想要在Android设备上获得完美的动漫观影体验吗&#xff1f;Hani…...

VMware虚拟机突然断网?别慌,试试这个NAT模式一键重置法(附主机WiFi适配器设置)

VMware虚拟机断网急救指南&#xff1a;NAT模式重置与主机适配器深度解析 从一次紧急调试说起 深夜11点23分&#xff0c;程序员老张正在虚拟机里调试一个即将上线的微服务接口。突然&#xff0c;git pull命令卡住不动&#xff0c;ping测试显示"Destination Host Unreachabl…...

终极碧蓝航线自动化脚本:Alas智能辅助工具完整指南

终极碧蓝航线自动化脚本&#xff1a;Alas智能辅助工具完整指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript AzurLaneAuto…...

别急着换件!汇川伺服报Er.136/Er.740编码器故障,先按这3步自查(附线缆选购建议)

汇川伺服编码器故障排查指南&#xff1a;从干扰溯源到线缆优化 工业现场最让人头疼的莫过于设备间歇性抽风——明明昨天还运行良好&#xff0c;今天却频繁报Er.136或Er.740编码器故障。作为经历过数十次类似案例的技术老兵&#xff0c;我必须强调&#xff1a;80%的编码器问题根…...

荣耀出征唯一官网下载:零氪平民友好 无套路轻松畅玩

国新出审〔2023〕941号&#xff0c;ISBN 978-7-498-12393-0&#xff0c;备案号&#xff1a;皖ICP备2023003237号-2。由河北传娱网络科技有限公司拥有著作权&#xff0c;方圆电子音像出版社有限责任公司正规出版&#xff0c;安徽游昕网络科技有限公司负责全程运营&#xff0c;资…...

终极指南:3分钟掌握TMSpeech,打造完全本地的实时语音转文字神器

终极指南&#xff1a;3分钟掌握TMSpeech&#xff0c;打造完全本地的实时语音转文字神器 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否厌倦了云端语音识别服务的隐私担忧和网络延迟&#xff1f;想要一个真正…...

【2026年华为暑期实习(AI)-5月20日-第二题- LLM 多源语料分级清洗预算分配】(题目+思路+JavaC++Python解析+在线测试)

题目内容 某 L L M LLM LLM 预训练团队从 N N N 个数据源收集语料,每个数据源 i i...

5个关键挑战:BiliTools跨平台架构如何应对大规模视频下载的性能瓶颈

5个关键挑战&#xff1a;BiliTools跨平台架构如何应对大规模视频下载的性能瓶颈 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/Bil…...

保姆级教程:STM32CubeMX配置ADC扫描模式,并封装一个灵活的Get_Adc()函数

STM32CubeMX实战&#xff1a;构建可动态配置的ADC多通道扫描系统 在嵌入式开发中&#xff0c;ADC&#xff08;模数转换器&#xff09;的灵活配置一直是硬件工程师面临的常见挑战。许多开发者在使用STM32CubeMX配置多通道ADC时&#xff0c;往往止步于基础扫描模式的应用&#xf…...