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

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

在软件开发过程中,我们经常会遇到一些假设条件或者预期行为。例如,我们可能假设一个函数的输入参数必须在某个范围内,或者某个变量的值应该满足特定的条件。当这些假设或预期行为被打破时,程序可能会出现异常行为,甚至崩溃。为了保护程序免受这些潜在错误的侵害,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);  // 假设输入值大于0printf("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断言,我们可以有效地保护程序免受错误数据的侵害,确保程序的稳定性和可靠性。因此,我们应该在开发过程中充分利用这一强大工具,提高我们代码的质量和健壮性。

相关文章:

  • 车载电子电器架构 —— 电子电气系统车载功能子系统
  • 【漏洞复现】多语言药房管理系统MPMS文件上传漏洞
  • 2024-02-11 Unity 编辑器开发之编辑器拓展2 —— 自定义窗口
  • mxxWechatBot基本配置
  • .NetCore 如何动态路由
  • leetcode链表相关题目
  • 树状菜单(利用映射-bootstrap+jQuery实现折叠功能)
  • 单片机学习笔记---蜂鸣器播放提示音音乐(天空之城)
  • Unity2D 学习笔记 0.Unity需要记住的常用知识
  • Vue中路由的使用
  • MyBatisPlus之分页查询及Service接口运用
  • 2023 年,我患上了 AI 焦虑症!
  • 百面嵌入式专栏(面试题)进程管理相关面试题1.0
  • 详细讲解ES6箭头函数语法(附Demo)
  • 中科大计网学习记录笔记(八):FTP | EMail
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 〔开发系列〕一次关于小程序开发的深度总结
  • es的写入过程
  • express + mock 让前后台并行开发
  • JavaScript DOM 10 - 滚动
  • Java基本数据类型之Number
  • JS专题之继承
  • MySQL QA
  • Next.js之基础概念(二)
  • redis学习笔记(三):列表、集合、有序集合
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Web Storage相关
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 代理模式
  • 汉诺塔算法
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 码农张的Bug人生 - 初来乍到
  • 前端面试总结(at, md)
  • 入门级的git使用指北
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • Python 之网络式编程
  • # .NET Framework中使用命名管道进行进程间通信
  • #1015 : KMP算法
  • #if和#ifdef区别
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $(selector).each()和$.each()的区别
  • (3)llvm ir转换过程
  • (done) 两个矩阵 “相似” 是什么意思?
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (九)One-Wire总线-DS18B20
  • (九)信息融合方式简介
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./configure,make,make install的作用(转)