- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我们还可以使用 printf 和 if-else 语句将通知用户 b 为 0 时,assert() 有什么用处?
#include <stdio.h>
#include <assert.h>
int main() {
int a, b;
printf("Input two integers to divide\n");
scanf("%d%d", &a, &b);
assert(b != 0);
printf("%d/%d = %.2f\n", a, b, a/(float)b);
return 0;
}
最佳答案
人们将这里的两件事混为一谈。验证运行时错误和编译时错误。
if
避免运行时错误假设用户应该只输入数字,但遇到的输入是字母数字那么这是一个运行时错误;作为程序员,您对此无能为力。你必须以一种用户友好、优雅的方式向用户提出这个问题;这涉及将错误冒泡到正确的层等。有多种方法可以做到这一点:返回错误值、抛出异常等。并非所有选项都适用于所有语言。
assert
捕获错误另一方面,程序员在编写新代码时依赖于设计时假设和不变量。假设您正在编写一个函数 make_unit_vec
,涉及将 vector 的分量除以其长度。传递 0 vector 会破坏此函数,因为它会导致被零除;一个无效的操作。但是,您不想每次都在这个函数中检查它,因为您确定没有调用者会传递 0 vector ——一个假设,不是关于外部用户输入,而是关于程序员控制的内部系统。
因此此函数的调用者不应传递长度为 0 的 vector 。如果其他程序员不知道此假设并通过传递 0 vector 来破坏 make_unit_vec
怎么办?为确保捕获到此错误,您放置了一个断言,即您正在断言(验证)您所做的设计时假设。
当调试构建在调试器下运行时,此断言将“触发”,您可以检查调用堆栈以找到出错的函数!但是,请注意断言不会在运行发布版本时触发。在我们的示例中,在发布版本中,如果不纠正错误的调用者,则会发生除零。
这就是 assert
仅在调试构建时启用的基本原理,即当 NDEBUG
未设置时。
关于c - 试图理解断言的用处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084385/
我正在阅读有关 Edit Distance between 2 strings 的问题。 它可以使用编辑距离的公式通过动态规划来解决。我无法理解的是它的用处。首先,这与知道 2 个字符串的最长公共(p
我是一名优秀的程序员,十分优秀!