C++ 标准库中的 cassert 功能 用法运用 详解

news/2025/3/10 13:51:35/文章来源:https://www.cnblogs.com/baisemoshui/p/18762526

C++标准库中的<cassert>头文件主要用于在程序中添加断言(assertions),它是一种调试工具,用于在开发阶段检查程序的逻辑是否符合预期。以下是对<cassert>的功能、用法及运用的详细解析:

一、功能概述

<cassert>头文件提供了一个宏:assert,用于在程序运行时检查某个条件是否为真。如果条件为假(false),程序将终止执行,并输出一条包含文件名、行号和失败表达式的错误信息。这有助于开发者快速定位问题。

二、用法详解

  1. 包含头文件

    在使用assert宏之前,需要包含<cassert>头文件:

    #include <cassert>
    
  2. 使用assert

    assert宏接受一个布尔表达式作为参数。如果表达式的结果为true,则程序继续执行;如果结果为false,则程序将终止,并输出一条错误信息。

    示例代码:

    #include <iostream>
    #include <cassert>int main() {int x = 5;assert(x == 5); // 条件为真,程序继续执行int y = 10;assert(y == 5); // 条件为假,程序终止并输出错误信息std::cout << "程序正常结束" << std::endl; // 这行代码将不会被执行return 0;
    }
    

    如果y == 5为假,程序将输出类似以下的错误信息:

    Assertion failed: y == 5, file example.cpp, line 8.
    
  3. 禁用断言

    在发布版本的程序中,通常需要禁用断言,以避免程序在运行时意外终止。这可以通过定义NDEBUG宏来实现:

    #define NDEBUG
    #include <cassert>
    

    当定义了NDEBUG宏后,所有的assert语句都会被忽略。

三、运用实例

  1. 检查函数的前置条件和后置条件

    使用assert宏可以检查函数的前置条件和后置条件,确保函数的输入和输出符合预期。

    示例代码:

    #include <cassert>
    #include <iostream>double squareRoot(double num) {assert(num >= 0); // 前置条件:输入必须是非负的// 牛顿迭代法计算平方根double guess = num;double prev_guess;do {prev_guess = guess;guess = (guess + num / guess) / 2.0;} while (guess != prev_guess);return guess;
    }int main() {double result = squareRoot(4.0);std::cout << "Square root of 4.0 is " << result << std::endl;// 以下代码会导致断言失败// double invalid_result = squareRoot(-1.0);return 0;
    }
    
  2. 检查程序的不变量

    使用assert宏可以检查程序中的不变量,即在程序的某个点上始终为真的条件。

    示例代码:

    #include <cassert>
    #include <iostream>
    #include <vector>void processVector(const std::vector<int>& vec) {size_t original_size = vec.size();// 假设进行一些操作,如移除元素std::vector<int> new_vec = vec;new_vec.pop_back();// 检查不变量:处理后的向量长度应小于原向量长度assert(new_vec.size() < original_size);std::cout << "Processing completed." << std::endl;
    }int main() {std::vector<int> vec = {1, 2, 3, 4};processVector(vec);return 0;
    }
    
  3. 检查指针是否为nullptr

    使用assert宏可以检查指针是否为nullptr,避免解引用空指针导致的程序崩溃。

    示例代码:

    #include <cassert>
    #include <iostream>void printData(int* data) {assert(data != nullptr); // 检查指针是否为nullptrstd::cout << *data << std::endl;
    }int main() {int value = 42;int* ptr = &value;printData(ptr);// 以下代码会导致断言失败// int* null_ptr = nullptr;// printData(null_ptr);return 0;
    }
    

四、注意事项

  1. 断言应仅用于调试

    断言主要用于调试阶段,以确保程序的逻辑正确性。在发布版本的程序中,应禁用断言以避免不必要的性能开销和程序终止。

  2. 避免在断言中使用复杂的逻辑或计算

    断言的表达式应该是简单的,避免使用复杂的逻辑或计算,以减少性能开销。

  3. 断言不应用于处理运行时的错误

    运行时错误应该通过异常处理或其他机制来处理,而不是依赖断言。

综上所述,<cassert>头文件提供的assert宏是C++程序中一种有用的调试工具,它可以帮助开发者在开发过程中快速发现和定位问题。然而,在使用时需要注意其局限性和注意事项,以确保程序的稳定性和可靠性。

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

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

相关文章

Zabbix 7.2 + Grafana 中文全自动安装ISO镜像

简介 ​基于Zabbix 官方的Alma Linux 8 作为基础镜像。镜像源都改为国内大学镜像站,自动联网安装Zabbix+Grafana。安装中文字体、Zabbix和Grafana也配置默认中文。Zabbix 也指定中文字体,绘图无乱码。配置时区为东八区,Zabbix配置Web时区也为东八区。Grafana自动安装zabbix源…

第十八章 项目绩效域(2025年详细解析版)

目录导学太极八卦与项目管理体系项目管理整体框架图绩效域原则和绩效域的关系18.1 干系人绩效域干系人绩效域概述定义预期目标绩效要点 :促进干系人参与目的作用促进干系人参与要做的六项活动与其他绩效域的相互作用(了解)关联为什么要促进干系人参与?为什么干系人重要?执…

PCA9306DCTR特征—400kHz I2C/SMBus电压电平转换器/S9S08DZ60F2VLCR/CC2650F128RSMR/MAX4715EXK SPST 开关

PCA9306DCTR是一款2 位双向 400kHz I2C/SMBus 电压电平转换器,可以在 1.2V 到 5V 之间实现双向电压转换而无须使用方向引脚。PCA9306DCTR是一款2 位双向 400kHz I2C/SMBus 电压电平转换器,可以在 1.2V 到 5V 之间实现双向电压转换而无须使用方向引脚。PCA9306DCTR具有低导通状…

快速理解Kubernetes 系统架构

Kubernetes 架构解析1. 整体架构:管理层 + 执行层 管理层(Master 节点)——"老板团队"API 服务器(kube-apiserver) ▶️ 公司的"前台",所有指令必须通过这里传达(如部署应用、查看状态) 调度器(kube-scheduler) ▶️ 像"项目经理",决…

001TypeScript开发实战

1、点击文件,点击打开文件夹 2、选择文件夹,打开文件夹 3、点击终端,新建终端 4、在终端内输入npm init vue@latest 按回车 5、写入项目名称 vue3-ts-cms 6、选择:这里我们先这样选择,Router(单页面应用开发)Pinia(状态管理)这次我们搭建一下7、 这里我们选择NO 可以看见…

​信创概念深度科普:从3大政策背景到5类典型应用场景全解析

信创,即信息技术应用创新产业,近年来在我国的科技发展领域占据着愈发重要的地位。它不仅仅是一个简单的产业概念,更是我国实现科技自立自强、保障国家信息安全的关键支撑。随着数字化时代的加速推进,信创产业迎来了前所未有的发展机遇,其涵盖的范围广泛,涉及到众多的政策…

数字逻辑 可编程阵列逻辑(PAL)

数字逻辑 可编程阵列逻辑(PAL) 参考书籍:数字逻辑基础与Verilog设计 原书第3版 P402 这里先给个可编程逻辑阵列(PLA)的例子。PLA的常用示意图中画X的就是选中的。 所以图 B.27 的计算过程为: \[\begin{align} P_1=& \ x_1x_2\\[1mm] P_2=& \ x_1 \overline x_{3…

基本项目目录解析

1、这里是说明vscode的相关配置的 recommendations 推荐的意思 最好安装的一些插件 这个必须安装 也可以看到这里有安装插件的弹窗 2、public这里是放入的我们的一些资源的 3、这里是放站点图标的,网站的的图标 4、src 就是放我们的源代码的5、node_modules 文件夹主要用来存…

ASE150N10-ASEMI中低压MOS管ASE150N10

ASE150N10-ASEMI中低压MOS管ASE150N10编辑:ll 强劲功率处理,驱动无限潜能 ASE150N10 最为亮眼之处在于它出色的电流承载能力。高达 150A 的连续漏极电流,如同一条奔腾不息的电子洪流,能够轻松应对各类大功率需求场景。想象一下,在电动汽车的动力控制系统里,它稳稳地调控着…

WMS系统能解决哪些仓储管理问题?

WMS系统能解决哪些仓储管理问题? ——库存锁库、库存预警、扫码出入库,这些都能搞定吗? 当然可以! 不仅如此,WMS系统还涵盖了订单管理、货物追踪、数据分析等功能。 今天咱们就来聊聊,仓储管理系统是如何实现库存锁定、提供库存预警、扫码出入库等操作的,帮你彻底解决仓…

task5.c

include<stdio.h> int main() { int s, year; s = 1000000000; year = s / 3600 / 24 / 365; if (year % 2 > 0) year += 1; printf("10亿秒约等于%d年\n", year); return 0; }

【牛客训练记录】2025年浙江中医药大学程序设计竞赛(同步赛)

训练情况赛后反思 C题犯蠢了,手玩几下就能猜出来的结论,结果自己想复杂了,以为是二分,D题又复现传智杯二分爆long long了,又没注意到,E题BFS搜索没记忆化MLE了 D题 传智杯二分爆long long重现,怒开__int128发现还是爆,只能边加边特判了,我们对于这题显然能观察到二分单…