assert(断言)的理解

一、assert的简单定义

1. 头文件

assert是一个宏,通常定义在头文件assert.h中,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。

2.assert宏的基本定义如下:

#include <assert.h>
void assert(int expression);
但实际上,assert的实现要复杂一些,它会在编译时检查是否定义了宏NDEBUG。如果定义了NDEBUG,那么assert宏在预处理阶段就会被忽略,不会进行任何操作。这通常用于发布版本的程序,以避免assert带来的性能开销和不必要的检查。

3.常用语句

assert(p!=NULL)。
这个语句验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序继续运⾏,否则就会终⽌运⾏,并且给出报错信息提⽰。

二、用处

assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣
任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误
流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。

三、利与弊

好处

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

坏处

assert() 的缺点是,因为引⼊了额外的检查,增加了程序的运⾏时间。
⼀般我们可以在 Debug 中使⽤,在 Release 版本中选择禁⽤ assert 就⾏,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响⽤⼾使⽤时程序的效率。

四、简单代码展示

 #include <stdio.h>
#include <assert.h>

int main() {
    int x = 5;
    assert(x > 0); // 如果x不大于0,程序将终止并输出错误信息  
    // ... 其他代码 ...  
    return 0;
}
#include <stdio.h>  
#include <assert.h>  

int main() {
    int x = 5;
    int y = 0;

    // 检查x是否大于0,如果是,则继续执行;如果不是,则程序将终止  
    assert(x > 0);

    // 假设y不应该为0,如果为0则是一个错误  
    // 这里的assert将触发,因为y等于0  
    assert(y != 0);

    // 如果上面的assert不触发,程序将执行到这里  
    printf("Both assertions passed, program continues.\n");

    return 0;
}

在上面的代码中,我们定义了两个整数变量x和y。第一个assert检查x是否大于0,由于x被初始化为5,所以这个条件是真的,程序将正常执行。然而,第二个assert检查y是否不等于0,由于y被初始化为0,这个条件是假的,因此assert将触发。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值