gpt4 book ai didi

c - 试图理解断言的用处

转载 作者:太空狗 更新时间:2023-10-29 16:12:43 25 4
gpt4 key购买 nike

当我们还可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com