【C语言】assert(断言)使用详解

🦄个人主页:小米里的大麦-CSDN博客

 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html

⚙️操作环境:Visual Studio 2022

目录

一、前言

二、什么是assert?

三、assert的使用方法 

1. 断言的基本语法

2. 断言的行为

3.断言的工作流程

4.使用场景

4.1 参数验证

4.2 状态检查

5..代码示例 

6. 注意事项

6.1 性能考虑  或  断言的调试模式与发布模式

6.2 错误处理

6.3断言的限制

四、总结

五、共勉


一、前言

在软件开发过程中,确保程序的正确性是非常重要的。为了帮助开发者在开发阶段尽早地发现潜在的问题,C语言提供了一个非常有用的工具——assert。本文将详细介绍 assert 的工作原理、使用方法以及一些最佳实践。

二、什么是assert?

assert 是一个预处理器宏,通常被用来在开发和测试阶段检测程序中某些关键假设是否成立。当某个断言失败时,assert 会终止程序,并输出一条错误信息,这有助于开发者快速定位问题所在。

三、assert的使用方法 

我们先来看一下assert - C++ Reference网站上assert的基本信息:

cplusplus.com - The C++ Resources Network 是一个关于 C++ 编程语言的资源网站,提供了一系列与 C++ 相关的信息和服务,适合所有级别的 C++ 开发者,无论是新手还是经验丰富的程序员都可以从中找到有价值的内容。

1. 断言的基本语法

assert 在C语言中是一个预处理器宏,定义在 <assert.h> 头文件中。其基本语法如下:

assert(expression);

这里 expression 是一个整型表达式,通常是一个条件表达式。

如果 expression 的值为 0(假),则 assert 触发并执行一系列操作;
如果 expression 的值为非 0(真),则 assert 语句被忽略,程序继续执行。

2. 断言的行为

expression 的值为 0 时,assert 会执行以下步骤:

  1. 输出一条错误消息到标准错误输出(stderr)。
  2. 调用 abort() 函数,导致程序立即终止。

如果 expression 的值为非 0,则 assert 什么也不做。

3.断言的工作流程

  1. 表达式求值assert 首先计算给定的表达式。
  2. 条件检查:如果表达式的值为假(即为0),则断言失败。
  3. 错误报告:断言失败时,assert 会输出一条错误信息到标准错误输出 stderr
  4. 程序终止:之后,assert 调用 abort() 函数来终止程序。

4.使用场景

4.1 参数验证

在函数中使用 assert 来验证传入的参数是否合法:

void print_array(const int *array, size_t len) {
    assert(array != NULL);  // 确保数组指针非空
    for (size_t i = 0; i < len; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

4.2 状态检查

确保程序运行到某个点时,状态是符合预期的:

int factorial(int n) {
    assert(n >= 0);  // 断言输入是非负数
    if (n == 0) return 1;
    return n * factorial(n - 1);
}

5..代码示例 

下面是一个简单的示例,演示如何使用 assert 来确保函数的参数有效:
#include <stdio.h>
#include <assert.h>

void divide(double numerator, double denominator) {
    assert(denominator != 0.0);  // 检查除数是否为零
    double result = numerator / denominator;
    printf("Result: %f\n", result);
}

int main() {
    divide(10.0, 2.0);  // 正常情况
    divide(10.0, 0.0);  // 断言失败
    return 0;
}
#include <stdio.h>
#include <assert.h>

// 计算两个正整数的乘积
int multiply(int a, int b) {
    assert(a > 0);  // 确保 a 是正数
    assert(b > 0);  // 确保 b 是正数
    return a * b;
}

int main() {
    int product = multiply(5, 3);
    printf("The product is: %d\n", product);

    // 这里尝试传递一个非正数,断言将会失败
    product = multiply(-5, 3);  // 断言失败
    return 0;
}
在这个例子中,multiply 函数使用 assert 来确保其输入参数 a 和 b 都是正数。
如果任何一个参数不是正数,则断言失败,程序将输出错误信息并终止。

6. 注意事项

6.1 性能考虑  或  断言的调试模式与发布模式

在调试模式下,assert 会被编译器保留,以便在开发过程中捕获错误。但在发布模式下,为了提高程序的运行效率,通常会禁用 assert

即:在正式发布的版本中,通常会关闭断言以提高性能。禁用 assert通过定义宏 NDEBUG 来实现:

#define NDEBUG
#include <assert.h>
或者在编译时添加 -DNDEBUG 标志。

6.2 错误处理

assert 不应该用于处理运行时错误。对于这类情况,可以使用错误处理机制,例如返回错误码或抛出异常。

6.3断言的限制

  • 只适用于开发阶段assert 主要用于开发阶段的调试,不应用于生产环境。
  • 不能处理运行时错误assert 不是用来处理运行时错误的,它主要用于检查程序逻辑上的假设是否成立。

四、总结

assert 是一个非常有用且强大的工具,可以帮助开发者在开发过程中快速定位和修复错误。通过合理使用 assert,可以显著提高代码的质量和可靠性。然而,需要注意的是,它应该谨慎使用,并且仅限于开发和测试环境。

五、共勉

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米里的大麦

您的支持是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值