Pilliaredrw
assert用法

assert用法

省流

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

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

1
2
3
4
5
6
7
8
9
10
11

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

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

断言的基本概念

下面是ai解释概念.

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

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

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

断言与 if 的比较

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

使用注意事项

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

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <assert.h>

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

int main() {
your_age(5); // 正常情况
your_age(-1); // 触发断言,程序将中止
return 0;
}