746 字
4 分钟
assert用法

省流#

“断言”用于在代码运行时验证某个条件是否为真( debug 阶段), 意思就是”我敢说它就成立”.当条件为假时,程序会中止并报告错误.其实也就是说: assert(绝对不可能为 FALSE 的语句如果 FALSE 了代表着你的代码有问题这里就会直接爆);. 我们在干活的时候就必须 100% 保证assert(val); // val!=0.

从最近几天的经验来看 assert(表达式) 在函数中使用的重点是用于判断”传入的参数是否合法”, 需要区别和”异常”的不同(可以处理的异常情况无计可施的非法情况). 比如让你对空队列弹出, 这时候就需要捕捉空队列信息并且处理而不是把程序炸掉. 即使它是调试工具也应当尽量防止滥用 assert. 举个例子, 比如下面这段代码:


// 判空
bool isE(Quece *q)
{
    assert(q);
    return q->size == 0
               ? TRUE
               : FALSE;
    // 这里的 TRUE 和 FALSE 多封装一层, 这样就可以是用户所宏定义的其他操作.
}

可以看到的是, return TRUE 或 FALSEassert各自有不同的分工. TRUE or FALSE是作为功能的一部分来提示用户. 而assert(断言失败)则是告诉垃圾代码的屎作俑者, 由于你的天才发挥, 这里爆炸了.

断言的基本概念#

下面是ai解释概念.

  • 语法:在 C 语言中,使用 assert 宏来实现断言:
#include <assert.h>
assert(condition);

condition 为假时,程序会停止执行,并输出错误信息.

  • 用途:
    • 调试:帮助开发者在开发过程中捕捉逻辑错误,确保程序的某些条件始终成立.
    • 文档:通过明确条件要求,自文档化代码,帮助其他开发者理解预期的程序状态.

断言与 if 的比较#

  • if 语句用于控制程序流,根据条件的真假执行不同的代码.
  • 断言则是一个条件检查工具,当条件为假时立即中止程序,而不是执行其他逻辑.这意味着:
  • 断言用于检查内部状态,而 if 处理已知的逻辑分支.
  • 断言捕捉不应发生的条件,if 用于处理用户输入等外部条件.

使用注意事项#

  1. 仅用于调试:在发布版本中,通常会禁用断言,以避免性能损失.
  2. 不替代错误处理:断言不应取代正常的错误处理逻辑,它们是用于捕捉程序员的错误,而不是处理用户输入导致的错误.
  3. 条件简洁:断言条件应尽量简单,方便调试时快速定位问题.

示例代码#

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

void your_age(int age) {
    assert(age > 0); // 年龄不可能负数
    // ...其他实现
}

int main() {
    your_age(5);  // 正常情况
    your_age(-1); // 触发断言,程序将中止
    return 0;
}
assert用法
https://noob.daze.su/posts/hexo归档/assert用法/
作者
孟红兵
发布于
2024-10-27