c语言--assert断言(详解)

目录

  • 一、断言的概念
  • 二、assert断言
    • 2.1 代码1
      • 2.1.1运行结果
      • 2.1.2分析
    • 2.2代码2
      • 2.2.1运行结果
      • 2.2.2分析
      • 2.3代码3
      • 2.3.1运行结果及其分析
    • 三、优点
    • 四、缺点
    • 五、注意

一、断言的概念

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 版本不影响用户使用时程序的效率。

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

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

相关文章

酷开系统 | 拓展内容营销边界,酷开科技大屏价值全面升维

丰富的内容是智能大屏吸引消费者的关键。随着智能大屏各类垂直应用的增多&#xff0c;和长、短视频等多元内容的加入&#xff0c;使消费者的使用需求进一步激发和释放&#xff0c;这些流量的加入&#xff0c;也使大屏成为了营销的天然宝藏。酷开科技一直致力于OTT大屏营销&…

9个Linux 查看系统硬件信息命令(实例详解)

在Linux下&#xff0c;我们精要遇到需要查看系统的硬件信息&#xff0c; 这里我罗列了查看系统硬件信息的实用命令&#xff0c;并做了分类&#xff0c;实例解说。 执行环境&#xff1a;ubuntu 16.04 1. cpu lscpu命令&#xff0c;查看的是cpu的统计信息. rootubuntu:/home/…

Hive与PrestoSQL中的并列列转行

并列列转行 1、背景描述2、Hive实现3、PrestoSQL实现 1、背景描述 通常我们在处理数据时&#xff0c;如果遇到一个字段存储多个值&#xff0c;常常需要把一行数据转换为多行数据&#xff0c;形成标准的结构化数据 例如&#xff0c;将下面的两列数据并列转换为三行&#xff0c;…

使用CHATGPT进行论文写作的缺点和风险

为了真正感受 ChatGPT 的写作潜力&#xff0c;让我们先将其与传统的论文写作方法进行一下比较分析 CHATGPT论文写作的缺点和风险 传统论文写作的考验和磨难很深&#xff1a;费力的研究、组织想法和精心设计的逻辑论证&#xff0c;往往以牺牲你的理智为代价。 进入ChatGPT&am…

【复现】WordPress html5-video-player SQL 注入漏洞_39

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 在WordPress中播放各种视频文件。一个简单&#xff0c;可访问&#xff0c;易于使用和完全可定制的视频播放器&#xff0c;适用于所…

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果&#xff08;升级版&#xff09; 7.P1618 三连击&…

go消息队列RabbitMQ - 订阅模式-fanout

1、发布订阅 订阅模式&#xff0c;消息被路由投递给多个队列&#xff0c;一个消息被多个消费者获取。 1&#xff09; 可以有多个消费者 2&#xff09; 每个消费者有自己的queue&#xff08;队列&#xff09; 3&#xff09; 每个队列都要绑定到Exchange&#xff08;交换机&…

c++阶梯之类与对象(中)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 构造函数概念的引出 2.2 构造函数的特性 3. 析构函数 3.1 析构函数的概念 3.2 特性 未使用构造与析构的版本 使用了构造与析构函数的版本 4. 拷贝构造函数 4.1 拷贝构造函数的概念 4.2 特性 结语 本节我们来认识…

使用 PyTorch 构建 NLP 聊天机器人

一、说明 聊天机器人提供自动对话&#xff0c;可以帮助用户完成任务或寻求信息。随着深度学习的最新进展&#xff0c;聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人&#xff0c;涵盖模型架构、数据准备、训练循环…

AIGC技术讲解以及应用的落地

简介 近期&#xff0c;火爆的“AI绘画”、图片转AI图&#xff0c;智能聊天软件ChatGPT&#xff0c;引起了人们广泛关注。人工智能潜力再次被证明&#xff0c;而这三个概念均来自同一个领域&#xff1a;AIGC。AIGC到底是什么&#xff1f;为什么如此引人关注&#xff1f;AIGC能产…

Linux ---- Shell编程之免交互

一、Here Document 多行重定向 1、Here Document定义 使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品Here Document 是标准输 入的一种替代品&#xff0c;可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个文件…

Java Lambda 表达式以及对 Lambda 表达式的简化

Java Lambda 表达式以及对 Lambda 表达式的简化 LambdaDemo.java package com.zhong.lambdademo;import java.util.Arrays; import java.util.Comparator;public class LambdaDemo {public static void main(String[] args) {Student[] student new Student[5];student[0] ne…

(15)求两个整数的平均值

文章目录 每日一言题目解题思路代码结语 每日一言 现在&#xff0c;我怕的并不是那艰苦严峻的生活&#xff0c;而是不能再学习和认识我迫切想了解的世界。对我来说&#xff0c;不学习&#xff0c;毋宁死。——罗蒙诺索夫 题目 输入两个整数m和n&#xff0c;写一个函数average…

createvm

New-VM -Name “new 5” -Generation 2 -BootDevice CD -NoVHD Set-VMDvdDrive -VMName TestVM -Path .\WinBuild.iso Set-VMFirmware “Test VM” -EnableSecureBoot Off Start-VM -Name TestVM debug-vm testuefiisov2 -InjectNonMaskableInterrupt -Force Write-Host $MyI…

GrayLog踩坑历险记

背景 GrayLog作为ELK的替代产品&#xff0c;是新生代的日志采集框架。在一个采集节点日志的需求中&#xff0c;因为节点很多&#xff0c;产生的日志也很多&#xff0c;因此尝试了使用GrayLog进行日志的采集。下面记录一下使用GrayLog中遇到的坑和解决方案。 一、部署与启动 …

论软件外包模式与企业信息化建设

企业信息化是企业在发展过程中的推进器&#xff0c;没有也可以勉强存活&#xff0c;但是谈不上加速。软件外包模式就是建造推进器的方法。软件外包模式大体分为以下几类&#xff1a; (1)购买现成的&#xff0c;在上面进行定制开发 代表用友&#xff0c;金蝶厂商&#x…

(十三)Java开发扩展之软件包与安装——JDK和MySQL

文章目录 1、RPM1.1、什么是RPM&#xff1f;1.2、RPM包的名称格式1.2.1、RPM查询命令1.2.2、RPM卸载命令1.2.3、RPM安装命令 2、YUM2.1、什么是YUM?2.2、yum安装程序命令 3、安装JDK4、安装MySQL 1、RPM 1.1、什么是RPM&#xff1f; RPM&#xff08;RedHat Package Manager&a…

《学成在线》微服务实战项目实操笔记系列(P1~P49)【上】

《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。同时也欢迎大家提问与讨论&#xff0c;我会尽力帮大家解…

阿里面试:Seata如何实现RC?保证事务的隔离性?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; Seata 如何实现 RC &#xff1f;保证事务的隔离性&#xff1…

使用sql创建数据库以及常用的sql简介

SQL简介 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统的标准编程语言。它用于执行各种操作&#xff0c;如查询、更新、插入和删除数据库中的数据。SQL是一种声明性语言&#xff0c;这意味着它指定了需要执行的操作&#xff0c;但不需…