【C语言】assert断言:保护程序的利器

news2025/1/23 17:37:19

在软件开发过程中,我们经常会遇到一些假设条件或者预期行为。例如,我们可能假设一个函数的输入参数必须在某个范围内,或者某个变量的值应该满足特定的条件。当这些假设或预期行为被打破时,程序可能会出现异常行为,甚至崩溃。为了保护程序免受这些潜在错误的侵害,C语言提供了一个强大的工具——assert断言。

目录

一、基本概念

二、assert的使用

三、assert的优缺点

总结


一、基本概念

assert是在头文件<assert.h>中的宏。通过我们会用assert去判断表达式是否满足一定条件,当满足条件时则正常通过,不满足的时候进行报错退出程序。      

原型如下:

#include <assert.h>

void assert(int expression);

报错内容将显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。

 

二、assert的使用

在需要进行检查的地方进行添加assert并加入需要判断的条件即可进行使用,简单举例如下:

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

void example_function(int value) 
{
    assert(value > 0);  // 假设输入值大于0
    printf("The value is %d\n", value);
}

int main() 
{
    example_function(5);  // 正确的输入值
    example_function(0);  // 错误的输入值,将触发断言
    return 0;
}

上面的例子中,我们定义了一个名为example_function的函数,它接收一个整数作为输入值。在这个函数中,我们使用了assert断言来检查输入值是否大于0。如果输入值不满足这个条件(例如传入0),则程序会触发断言并终止运行,并将出错的问题进行反馈。

三、assert的优缺点

优点:

  1. 我们可以随意的去控制assert的开启和关闭,如果我们已经确定程序,没有问题,那么我们可以在程序的前面再定义一个宏NEBUG来关闭assert
    #define NDEBUG
  2. 帮助我们确保程序的正确性。通过在代码中添加assert语句,我们可以确保某些重要的假设条件得到满足。这有助于我们在开发过程中发现潜在的问题,从而避免在生产环境中出现严重的错误。
  3. 提高程序的稳定性。当程序遇到不符合预期的输入或状态时,使用assert断言可以及时终止程序的执行,防止错误进一步扩散。这样可以降低程序崩溃的风险,提高用户体验。
  4. 便于调试和测试。在开发过程中,我们经常需要对程序进行调试和测试。使用assert断言可以帮助我们快速定位问题所在,因为它会在条件不满足时立即给出反馈。此外,assert断言还可以作为一种轻量级的单元测试手段,用于验证函数的局部行为。
  5. 提高代码的可读性和可维护性。通过在代码中明确使用assert断言,我们可以向其他开发者传达我们的意图和期望。这有助于提高代码的可读性,使得其他开发者更容易理解和使用我们的代码。同时,这也方便了我们自己在未来对代码进行维护和扩展。

缺点:

引⼊了额外的检查,增加了程序的运⾏时间。

但是关于缺点的问题我们可以在开发版本进行开启assert在发布版本将assert关闭就好了。还有在VS这种集成开发环境中release版本会自动关闭assert,避免程序运行时间慢的2问题。

总结

本文介绍了C语言中的assert断言的基本概念、使用方法以及在实际开发中的作用。通过合理使用assert断言,我们可以有效地保护程序免受错误数据的侵害,确保程序的稳定性和可靠性。因此,我们应该在开发过程中充分利用这一强大工具,提高我们代码的质量和健壮性。

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

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

相关文章

轻薄型机型EM-T195,对移动作业so easy

由于移动工作环境特殊且不固定&#xff0c;不仅温差大&#xff0c;还会产生潮湿、干燥、灰尘等恶劣气候环境&#xff0c;使普通平板电脑无法适应移动工作。但三防平板电脑是设计制造的&#xff0c;材料特殊&#xff0c;可以平静面对上述恶劣环境&#xff0c;保证随时随地保持良…

备战蓝桥杯---数学基础3

本专题主要围绕同余来讲&#xff1a; 下面介绍一下基本概念与定理&#xff1a; 下面给出解这方程的一个例子&#xff1a; 下面是用代码实现扩展欧几里得算法&#xff1a; #include<bits/stdc.h> using namespace std; int gcd(int a,int b,int &x,int &y){if(b…

C++三剑客之std::optional(一) : 使用详解

相关文章系列 C三剑客之std::optional(一) : 使用详解 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 目录 1.概述 2.构建方式 2.1.默认构造 2.2.移动构造 2.3.拷贝构…

【深度学习:迁移学习】图像识别预训练模型的迁移学习

【深度学习&#xff1a;迁移学习】图像识别预训练模型的迁移学习 什么是迁移学习&#xff1f;为什么不从头开始训练模型&#xff1f;迁移学习的优点是&#xff1a;如何使用预训练模型进行迁移学习&#xff1a;迁移学习的过程&#xff1a;实施迁移学习来构建人脸识别模型&#x…

tcp 中使用的定时器

定时器的使用场景主要有两种。 &#xff08;1&#xff09;周期性任务 这是定时器最常用的一种场景&#xff0c;比如 tcp 中的 keepalive 定时器&#xff0c;起到 tcp 连接的两端保活的作用&#xff0c;周期性发送数据包&#xff0c;如果对端回复报文&#xff0c;说明对端还活着…

【GAMES101】Lecture 22 物理模拟与仿真

目录 单粒子模拟 显式欧拉方法 改进 中点法/修正的欧拉方法 自适应步长 隐式欧拉方法 非物理改变位置&#xff08;Position-Based / Verlet Integration&#xff09; 刚体模拟 流体模拟 单粒子模拟 先来研究粒子的运动&#xff0c;假设有一个速度矢量场&#xff0c;对…

记录一下,我使用stm32实现pwm波输入,以及对频率和占空比的计算,同时通过串口输出(实现-重要)

1&#xff0c;首先看下半物理仿真 看下我的配置&#xff1a; 看下计算方法以及matlab的仿真输出的数据&#xff1a; timer3的ch2是选择高电平&#xff0c;计算频率 timer3的ch1是选择的是低电平&#xff0c;用来计算周期 其中TemPIpre表示的是CH2输出的值&#xff0c; TemPI…

牛客周赛 Round 32 解题报告 | 珂学家 | 状压 + 前缀和异或map技巧

前言 整体评价 属于补题&#xff0c;大致看了下&#xff0c;题都很典。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的 01 背包 思路: 数学题 v, x, y list(map(int, input().split()))print (v // x * y)B. 小红的 dfs 思路: 枚举 其实横竖都有dfs…

网络协议与攻击模拟_16HTTP协议

1、HTTP协议结构 2、在Windows server去搭建web扫描器 3、分析HTTP协议流量 一、HTTP协议 1、概念 HTTP&#xff08;超文本传输协议&#xff09;用于在万维网服务器上传输超文本&#xff08;HTML&#xff09;到本地浏览器的传输协议 基于TCP/IP(HTML文件、图片、查询结构等&…

Windows Anaconda 运行 gempy examples。示例::

默认读者已安装&#xff1a;Anaconda. 若未安装请参考以下文章&#xff1a; Windows中如何使用 Anaconda 和 gempy地质建模 1&#xff0c;打开Anaconda Navigator: 打开后如此&#xff1a; 运行JupyterLab: launch。 打开gempy example 建模示例&#xff1a; 官方地址&#x…

Linux diff命令

参考资料 【 diff 】コマンド&#xff08;基本編&#xff09;――テキストファイルの差分を出力する便利なdiffコマンド使い方 目录 前期准备一. 基本语法二. 文件比较2.1 无配置项2.2 -B 忽略空行&#xff0c;-w忽略空格2.3 -y 文件内容横向比较显示2.4 -q 仅显示文件是否不同…

AlmaLinux右键菜单(基于GNOME桌面)

文章目录 前言前提说明在文件上右键在文件夹上右键 前言 在使用VSCode的过程中&#xff0c;AlmaLinux没能像Windows一样在右键菜单上显示打开方式&#xff0c;所以找了一下解决方案&#xff0c;罗列出来 前提说明 虽然说无论是media还是StackOverflow都推荐使用这条命令&…

2024年华为OD机试真题-多段线数据压缩-Java-OD统一考试(C卷)

题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3, 7), (3, 6), (3, 5), (4, 4), (5, 3), (6, 2), (7, 3), (8, 4), (7, 5)。 但可以发现,这…

Stable Diffusion 模型下载:majicMIX lux 麦橘辉耀 - V3

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

王树森《RNN Transformer》系列公开课

本课程主要介绍NLP相关&#xff0c;包括RNN、LSTM、Attention、Transformer、BERT等模型&#xff0c;以及情感识别、文本生成、机器翻译等应用 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) &#xff08;一&#xff09;NLP基础 1、数据处理基础 数…

【DDD】学习笔记-统一语言与领域分析模型

无论你采用什么样的软件开发过程&#xff0c;对于一个复杂的软件系统&#xff0c;都必然需要通过分析阶段对问题域展开分析&#xff0c;如此才能有的放矢地针对该软件系统的需求寻找设计上的解决方案。在领域驱动设计中&#xff0c;分析阶段完全围绕着“领域”为中心展开&#…

RabbitMQ(保姆级教程)

RabbitMQ学习 基础 1. 同步通信和异步通信 同步调用 下一步动作必须依赖上一步 异步调用 通知到位就行&#xff0c;不对消费者做强制要求&#xff0c;只要求最终一致性就行 2. MQ技术选项 消息先进先出&#xff0c;RabbitMQ默认有序 Erlang 是面向并发&#xff0c…

STM32 + ESP8266,连接阿里云 上报/订阅数据

&#xff08;文章正在编辑中&#xff0c;一点点地截图操作过程&#xff0c;估计要拖拉两三天&#xff09; 一、烧录MQTT固件 ESP8266出厂时&#xff0c;默认是AT固件。连接阿里云&#xff0c;需要使用MQTT固件。 1、独立EPS8266模块的烧录方法 2、魔女开发板&#xff0c;板载…

备战蓝桥杯---组合数学基础1

让我们来几道高中的组合题吧&#xff1a; 1.我们一定有n个向下&#xff0c;为 2.我们挑最大的两个&#xff0c;条件是他们奇偶性相同&#xff0c;为2*A10,2; 3.用捆绑法即可。 4.我们用隔板法&#xff0c;为 5.问题等价于23个相同的球放到3个盒子里&#xff0c;每个盒子至少…

【北邮鲁鹏老师计算机视觉课程笔记】04 fitting 拟合

【北邮鲁鹏老师计算机视觉课程笔记】04 fitting 拟合 1 拟合的任务 如何从边缘找出真正的线&#xff1f; 存在问题 ①噪声 ②外点、离群点 ③缺失数据 2 最小二乘 存在的问题 3 全最小二乘 度量的是点到直线的距离而不是点在y方向到直线的距离 提示&#xff1a;点到直线的…