c语言中assert断言用法实例详解

 更新时间:2024年02月07日 08:28:46   作者:权^  
断言是C语言中一种用于检查程序中假设语句正确性的方法,通过使用断言,开发人员可以在程序中插入一些条件,以确保程序的执行满足特定的预期,这篇文章主要给大家介绍了关于c语言中assert断言用法的相关资料,需要的朋友可以参考下

一、断言的概念

assert.h 头⽂件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。

二、assert断言

assert(p != NULL);

上面代码在程序运行到这一行语句时,验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序继续运行,否则就会终止运行,并且给出报错信息提升。assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值非零),assert() 不会产⽣任何作用,程序继续运行。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写⼊⼀条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。

2.1 代码1

#include<stdio.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	return 0;
}

2.1.1运行结果

这里显示assert未定义,需要包含头文件

#include<assert.h>

完整代码:

#include<stdio.h>
#include<assert.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	return 0;
}

再次运行,运行结果:

2.1.2分析

报错会告诉你在哪一行。

2.2代码2

#include<stdio.h>
#include<assert.h>
int main()
{
	int a = 10;
	int* p = &a;
	assert(p != NULL);
	printf("%d", *p);
	return 0;
}

2.2.1运行结果

2.2.2分析

assert不等于 NULL ,程序继续运行,结果没有报错。

2.3代码3

#include<stdio.h>
#include<assert.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	assert(a>10);
	printf("%d", a);
	return 0;
}

2.3.1运行结果及其分析

三、优点

assert() 的使用对程序员是非常友好的,使用 assert() 有几个好处:它不仅能⾃动标识文件和出问题的行号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问题,不需要再做断言,就在 #include <assert.h> 语句的前面,定义⼀个宏 NDEBUG 。

#define NDEBUG
#include <assert.h>

然后,重新编译程序,编译器就会禁用文件中所有的 assert() 语句。如果程序⼜出现问题,可以移除这条 #define NDBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert() 语句。

代码:

#include<stdio.h>
#define NDEBUG
#include<assert.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	assert(a>10);
	printf("%d", a);
	return 0;
}

运行结果及其分析:

四、缺点

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

五、注意

一般我们可以在 Debug 中使用,在 Release 版本中选择禁用 assert 就行,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响用户使用时程序的效率。

附:用法总结与注意事项

1)在函数开始处检验传入参数的合法性,如:

int resetBufferSize(int nNewSize){undefined
//功能:改变缓冲区大小,
//参数: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++;

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

总结

到此这篇关于c语言中assert断言用法的文章就介绍到这了,更多相关c语言assert断言详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++面试八股文之位运算问题详解

    C++面试八股文之位运算问题详解

    这篇文章主要为大家介绍了C++面试八股文之位运算的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 使用C++一步步实现俄罗斯方块

    使用C++一步步实现俄罗斯方块

    本文给大家分享的是作者在使用C++制作俄罗斯方块的时候的思路分析以及开发准备和实验原理,都是些基础的知识储备,希望大家能够喜欢,具体的代码我们下一节再分享给大家
    2017-12-12
  • JsonCpp中double的问题解决

    JsonCpp中double的问题解决

    本文主要介绍了JsonCpp中double的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 探讨C语言的那些小秘密之断言

    探讨C语言的那些小秘密之断言

    我尽可能的把我所理解的断言的使用讲解清楚,希望我在此所讲的断言能够对你有所帮助,让你以后能够在代码中灵活使用断言
    2013-09-09
  • 解析C++浮点数无效值的定义与无效值判定的小结

    解析C++浮点数无效值的定义与无效值判定的小结

    本篇文章是对C++中浮点数无效值的定义与无效值的判定进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现LeetCode(187.求重复的DNA序列)

    C++实现LeetCode(187.求重复的DNA序列)

    这篇文章主要介绍了C++实现LeetCode(187.求重复的DNA序列),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++中的Z字形变换问题

    C++中的Z字形变换问题

    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列,这样一个需求怎么实现呢,下面小编给大家带来了C++中的Z字形变换问题,需要的朋友可以参考下
    2022-07-07
  • C语言中的getchar和putchar的使用方法

    C语言中的getchar和putchar的使用方法

    这篇文章主要介绍了C语言中的getchar和putchar的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • 详解C语言之单链表

    详解C语言之单链表

    这篇文章主要为大家介绍了C语言的单链表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C++ 设置透明背景图片

    C++ 设置透明背景图片

    这篇文章主要介绍了C++ 设置透明背景图片的相关资料,需要的朋友可以参考下
    2015-06-06

最新评论