iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言断言函数assert()的学习笔记
  • 591
分享到

C语言断言函数assert()的学习笔记

2024-04-02 19:04:59 591人浏览 泡泡鱼
摘要

  在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数。如果表达式的值为假(非零),则assert()宏

  在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数。如果表达式的值为假(非零),则assert()宏就在标准错误流(stderr)中写入一条错误信息,并调用abort()函数终止程序。

  下面通过一个简单的例子来看一下assert()的用法。


int main()
{
	int n = 1;
	assert(n>=0);
	printf("%d \r\n",n);
	system("pause");
	return 0;
}

  在assert()中表达式判断的条件是 n > 0 ,那么当整形变量n的值小于0时,就说明表达式为假,断言函数就会起作用。这里先试一下正常情况,将n的值设置为1,输出结果如下:

在这里插入图片描述

  接下来将 n 的值改为 -1,继续测试

在这里插入图片描述

  此时程序异常终止了。下面详细分析一下,这个函数的执行过程。

在这里插入图片描述

  在assert.h头文件中可以查看到assert()的原型,这里有两个原型,一个是当定义了 _UNICODE 或者 UNICODE 时调用的是第一个assert(),当没有定义时,调用的是第二个assert()。由于在头文件中没有定义 _UNICODE 或 UNICODE,所以这里调用的是第二个assert。下面开始分析这条宏定义语句。


#define assert(_Expression) (void) 	((!!(_Expression)) ||  (_assert(#_Expression,__FILE__,__LINE__),0))

void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);

  首先 assert 中传入了一个参数 _Expression ,接着还有有一条语句,里面有两部分由或运算符连接。对于或运算符 || 来说,当第一个条件成立时就不会执行第二个条件,只有当第一个条件不成立时才会执行第二条语句。


((!!(_Expression)) ||  (_assert(#_Expression,__FILE__,__LINE__),0))

  首先来看第一个判断条件 (!!(_Expression)),给传入的参数取了两次非,也就相当于变量本身,当 _Expression 为真时,就不会执行 第二个条件,只有 _Expression 为假时,才会执行第二个条件。在程序中当 n > 0 成立时就不会执行第二个条件,当 n > 0 不成立时,才会执行第二条语句,所以在上面测试中,当 n = -1 时,程序才会异常终止。

  接下来看第二个条件 (_assert(#_Expression,FILE,LINE),0) 这是一个函数,它的原型是:


void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);

  这个函数有三个参数,根据这三个参数的名称大概可以推断出,第一个参数是用来存储信息内容,第二个参数是用来表示当前文件的详细信息,第三个参数表示代码中那一行出错。

在这里插入图片描述

  这三个参数和控制台打印的内容相符合,Program 后面跟着的是当前运行的可执行文件路径,File 后面跟着的是报错的文件路径,Line 后面跟着的是 出错的具体位置,说明在 test6.c 文件中第16行程序出现了错误,最后一行提示出错的表达式 为 n>=0 ,说明变量n 大于等于0这个条件不成立,也就是当前变量n的值小于0,所以引发了程序异常。

  通过上面的分析可以看出,assert()对应调试程序来说很有帮助,像这种隐藏在代码中的错误在编译程序的时候,编译器是检测不出来的,只有当程序执行的时候才会发现。所以通过assert()来检测表达式就可以快速的定位程序的bug。

  加入不想使用assert()来检测了,不需要修改代码,只需要在assert.h中定义 NDEBUG就行了。

在这里插入图片描述

 在assert.h中添加宏定义,继续运行程序。

在这里插入图片描述

  此时n的值为-1,但是程序正常的打印出了-1,并没有报错。说明assert()不检测错误了。这个从头文件中也可以看出。

在这里插入图片描述

  当定义了NDEBUG之后,**assert(_Expression)**执行的具体函数就变成了 ((void)0),也就是啥也不干了。所以当在头文件中定义了NDEBUG之后,assert()的检测功能就自动失效了。这样在调试程序的时候,只需要一条语句就可以开启或者关闭调试信息输出了。

到此这篇关于C语言断言函数assert()的学习笔记的文章就介绍到这了,更多相关C语言断言函数assert()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言断言函数assert()的学习笔记

本文链接: https://www.lsjlt.com/news/157257.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言断言函数assert()的学习笔记
      在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数。如果表达式的值为假(非零),则assert()宏...
    99+
    2022-11-12
  • C语言assert断言函数的作用是什么
    C语言中的assert断言函数主要用于在代码中插入一些检查点,用于检查某个条件是否为真。如果条件为真,那么断言通过,程序继续执行。如...
    99+
    2023-09-11
    C语言
  • R语言学习笔记之plot函数
    目录前言一、plot函数基本函数二、plot函数其他常用的参数三、一个完整的实例总结前言 plot函数是R语言中画图使用最多的函数,参数也非常之多,简单的总结,之后应该会在学习的过程...
    99+
    2022-11-13
    r语言plot函数用法 r语言plot函数怎么用 R plot函数
  • C语言断言函数assert()的使用方法是什么
    本篇内容介绍了“C语言断言函数assert()的使用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  在C语言库函数中提供了一个辅...
    99+
    2023-06-25
  • R语言学习笔记之lm函数详解
    在使用lm函数做一元线性回归时,发现lm(y~x+1)和lm(y~x)的结果是一致的,一直没找到两者之间的区别,经过大神们的讨论和测试,才发现其中的差别,测试如下: -------...
    99+
    2022-11-11
  • Go语言和Spring函数:完整学习笔记
    Go语言和Spring函数都是现代编程语言中广受欢迎的语言,它们在不同的领域有着各自的优势。本文将介绍Go语言和Spring函数的基础知识和常用的操作,帮助读者更好地理解和使用这两种语言。 一、Go语言入门 Go语言是一门开源的编程语言,...
    99+
    2023-08-08
    spring 函数 学习笔记
  • [python学习笔记]Python语言
    赶时髦,python这么火,学习一哈 1.Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则     摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu、内存、硬盘、电子产品价格等都遵...
    99+
    2023-01-30
    学习笔记 语言 python
  • C语言入门学习笔记之typedef简介
    在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。 typedef 创建的符号只能用于数据类型,...
    99+
    2022-11-12
  • node.js学习之断言assert的使用示例
    一. 简介 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在...
    99+
    2022-06-04
    断言 示例 node
  • 如何通过Go语言编写Spring函数:学习笔记
    在当今软件开发领域中,无论是大型企业应用还是小型应用程序,都需要使用到函数。而Spring Cloud Functions则是一个新的框架,它可以让开发人员通过函数的方式来构建应用程序。本文将介绍如何使用Go语言编写Spring函数。 一...
    99+
    2023-08-08
    spring 函数 学习笔记
  • c语言之assert()函数怎么使用
    `assert()`函数是C语言标准库 `` 中的一个宏,用于在程序中插入断言。 断言是程序员在编写代码时用于检查程序的逻辑错误的一...
    99+
    2023-10-24
    c语言
  • c语言assert函数的作用是什么
    assert函数是C语言标准库中的一种调试工具,其作用是在程序运行时检查某个条件是否为真,如果条件为假,则终止程序运行并输出错误信息...
    99+
    2023-05-25
    c语言assert函数 c语言
  • C语言assert函数的作用有哪些
    C语言assert函数的作用有以下几个:1. 断言程序中的某个条件是正确的,如果条件不成立,程序会立即终止并输出错误信息。2. 在程...
    99+
    2023-06-13
    assert函数
  • Go语言和Spring如何共同构建函数?学习笔记
    随着云计算技术的发展,函数计算成为了一个备受关注的技术。作为一种无服务器的运行方式,函数计算可以帮助开发者更快速、更高效地开发应用程序。在函数计算中,函数是一个非常重要的概念。那么,如何在Go语言和Spring中共同构建函数呢?本文将为大...
    99+
    2023-08-08
    spring 函数 学习笔记
  • C语言学习笔记之VS2022安装使用教程
    目录一、安装VS2022二、创建项目测试程序三、遇到问题四、解决办法一、安装VS2022 参照B站安装教程安装。 Tips:选择安装信息的时候,学习C语言勾选“通用Win...
    99+
    2022-11-13
  • C语言学习笔记之字符串间的那些事
    目录字符串表示方式#strlen#strcpy和strncpy##strcpy##strcnpy#strcat和strncat##strcat ##strncat#strc...
    99+
    2022-11-13
  • C语言编程PAT乙级学习笔记示例分享
    目录1001 害死人不偿命的(3n+1)猜想1002 写出这个数1003 我要通过!1004 成绩排名1005 继续(3n+1)猜想1006 换个格式输出整数1007 素数对猜想问题...
    99+
    2022-11-13
  • Go语言:入门到精通的学习笔记
    Go语言是一种开源的编程语言,由Google公司开发。它的设计目标是提高程序的可读性和可维护性,同时保持高效性和安全性。本文将带您从入门到精通,深入了解Go语言的基础知识和高级特性,并附上演示代码供您参考。 一、入门 Go语言的基本语法与C...
    99+
    2023-08-16
    laravel 学习笔记 shell
  • C语言学习之函数知识总结
    目录前言一、引入二、认识函数三、函数的作用四、函数的返回值五、定义函数六、函数的类型七、return语句与break语句的区别八、函数的分类九、主函数十、函数使用举例十一、函数的声明...
    99+
    2022-11-13
  • 你需要知道的关于Go语言和Spring函数的学习笔记
    Go语言和Spring函数是目前非常流行的编程语言和框架,在互联网和移动应用开发领域拥有广泛的应用。如果你想成为一名优秀的开发人员,那么学习这些技术是非常重要的。在本篇文章中,我们将介绍一些关于Go语言和Spring函数的学习笔记,帮助你...
    99+
    2023-08-08
    spring 函数 学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作