C++ 如何使用断言函数
什么是C++ 如何使用断言函数,c++,c,C++,C,什么是 assert( scanf("%d", &t) == 1 ); 及 assert(1assert不返回任何内容,如果参数为false,则程序将终止。assert适用于不应该发生的情况……但您只需在错误假设或类似情况下进行检查即可 Assert不返回任何内容,如果参数为false,则程序终止。Assert适用于不应该发生的情况……但您可以在错误假设或类似情况下进行检查 断言所做的是计算表达式,如果它计算的值与0/false比较,则程序终止 assert所做的是计算表达式,如果
assert( scanf("%d", &t) == 1 );
及
assert(1assert不返回任何内容,如果参数为false,则程序将终止。assert适用于不应该发生的情况……但您只需在错误假设或类似情况下进行检查即可
Assert不返回任何内容,如果参数为false,则程序终止。Assert适用于不应该发生的情况……但您可以在错误假设或类似情况下进行检查
断言所做的是计算表达式,如果它计算的值与0/false比较,则程序终止
assert所做的是计算表达式,如果其计算结果与0/false比较,则程序终止。不要将assert与用户输入一起使用。assert旨在通过崩溃程序来捕获逻辑错误(如果断言失败,则调用abort),用户输入永远不会崩溃程序
但是为了回答您的问题,如果定义了NDEBUG,则assert不执行任何操作。这可能是程序未按预期崩溃的原因。不要在用户输入中使用assert。assert用于捕获逻辑错误(如果断言失败,则调用abort)通过使程序崩溃,用户输入永远不会使程序崩溃
但是为了回答您的问题,如果定义了NDEBUG,那么assert什么也不做。这可能是您的程序没有按预期崩溃的原因。您可以假设assert声明如下:
/*!
* Immediately crash the program if assumption is proven invalid.
*/
void assert (bool assumption);
如果您“知道”变量t
永远不会超出范围[1,10],因为是您编写的代码,并且您的代码无法生成任何其他值,则可以断言该语句
断言显而易见的事情
考虑以下断言的使用:
int t = 9;
assert (9 == t); // A very valid assertion, if a little pedantic.
上面的代码应该看起来像是在陈述显而易见的东西真的,但更重要的是<强>其他任何结果都是疯狂的<强>。学习<代码> t!= 9 < /Cord>会消除所有关于C++如何工作的假设,计算机如何执行数学和存储值,不管我们存在还是意识是否只是由如此多的加重电子形成的幻觉……
但这就是断言的价值所在
即便如此,计算机在所有实际用途中都是100%确定性的,“疯狂”的事情确实会发生。这也并不罕见。事实上,我们在代码中明确地写入断言,以检测这些情况,并给我们一个找出发生了什么的机会。这里考虑一些导致疯狂行为的现实原因
“疯狂”行为的原因
你的断言应该防止诸如
线程同步不正确
int t;
// Thread 1
t = 9;
assert(t == 9);
// Thread 2
t = 3;
assert(t == 3);
内存管理不好
class X {
void sayHello () {
assert(this != NULL); // An object that does not exist cannot say hello.
std::cout << "Hello?" << std::endl;
}
};
// Without the assertion, this code would actually run!
X* x = NULL;
x->sayHello();
此列表不完整,但它应该为您提供如何(以及如何不)应用断言的更广泛指导。您可以假设断言声明如下:
/*!
* Immediately crash the program if assumption is proven invalid.
*/
void assert (bool assumption);
如果您“知道”变量t
永远不会超出范围[1,10],因为是您编写的代码,并且您的代码无法生成任何其他值,则可以断言该语句
断言显而易见的事情
考虑以下断言的使用:
int t = 9;
assert (9 == t); // A very valid assertion, if a little pedantic.
上面的代码应该看起来像是在陈述显而易见的东西真的,但更重要的是<强>其他任何结果都是疯狂的<强>。学习<代码> t!= 9 < /Cord>会消除所有关于C++如何工作的假设,计算机如何执行数学和存储值,不管我们存在还是意识是否只是由如此多的加重电子形成的幻觉……
但这就是断言的价值所在
即便如此,计算机在所有实际用途中都是100%确定性的,“疯狂”的事情确实会发生。这也并不罕见。事实上,我们在代码中明确地写入断言,以检测这些情况,并给我们一个找出发生了什么的机会。这里考虑一些导致疯狂行为的现实原因
“疯狂”行为的原因
你的断言应该防止诸如
线程同步不正确
int t;
// Thread 1
t = 9;
assert(t == 9);
// Thread 2
t = 3;
assert(t == 3);
内存管理不好
class X {
void sayHello () {
assert(this != NULL); // An object that does not exist cannot say hello.
std::cout << "Hello?" << std::endl;
}
};
// Without the assertion, this code would actually run!
X* x = NULL;
x->sayHello();
此列表不完整,但它应该为您提供如何(以及如何不)应用断言的更广泛指导。解决问题的正确方法是将scanf()
函数封装在一个知道它在做什么的函数中:
int AskNumberOfWidgetFrobs() {
int count = 0;
for(;;) // Until we get a valid number
scanf("%d", &count);
if (count > 0 && count <= 10) {
return count;
} else {
printf("%d is not a valid number of WidgetFrobs\n", count);
}
}
}
int AskNumberOfWidgetFrobs(){
整数计数=0;
for(;;)//直到我们得到一个有效的数字
scanf(“%d”、&count);
如果(count>0&&count问题的正确解决方案是将scanf()
函数封装在一个知道它在做什么的函数中:
int AskNumberOfWidgetFrobs() {
int count = 0;
for(;;) // Until we get a valid number
scanf("%d", &count);
if (count > 0 && count <= 10) {
return count;
} else {
printf("%d is not a valid number of WidgetFrobs\n", count);
}
}
}
int AskNumberOfWidgetFrobs(){
整数计数=0;
for(;;)//直到我们得到一个有效的数字
scanf(“%d”、&count);
如果(count>0&&count这是我所期望的答案:
特别地
#include <assert.h>
#包括
在源文件开头的单独一行中
现在,只要bool不是true,就可以使用assert(bool)终止程序
(其他答案是关于“如何正确使用断言”的问题)这是我希望得到的答案:
特别地
#include <assert.h>
#包括
在源文件开头的单独一行中
现在,只要bool不是true,就可以使用assert(bool)终止程序
(其他答案是关于“如何正确使用断言”的问题)从技术上讲,这是一个宏,不是一个函数。第一个检查用户输入是否为1,另一个检查范围是否在1到10之间included@MimiEAM,scanf
的返回值是成功输入的项目数。除其他注释外,请注意,assert
仅在调试模式下编译。如果议员