了解C/C ++中的断言
时间:2020-02-23 14:31:51 来源:igfitidea点击:
在本文中,我们将研究使用断言的概念,以及C/C ++中的断言。
我们将首先了解断言的含义,然后探讨如何在C程序中使用它来有效调试!
什么是断言?
断言是一种规范,它在程序执行期间(运行时条件检查)验证程序在特定点上满足某些条件。
对于计算机程序,主要有三种断言检查类型:
- 前提条件断言->执行主体之前满足条件
- 后置条件声明->执行主体后满足条件
- 不变断言->在函数的每个重复区域之后都满足条件(例如循环)
现在我们知道了什么是断言,让我们来看一下在C程序中执行此操作的过程。
在C程序中使用断言
在C语言中,我们使用assert宏定义断言语句。
这在 <assert.h>
头文件中。
要定义一个断言,我们可以这样写:
#include <assert.h> assert (condition); </code>
其中" condition"必须为布尔值。
例如,以下是断言的示例:
int i=0; assert (i >= 0); </code>
由于" 0> = 0",上述断言成立。
因此,在执行过程中,我们的程序可以正常继续。
如果断言条件为假,则将产生错误,并且我们的程序将停止执行,并显示适当的错误消息。
int i = 0; //This is false assert (i > 0); </code>
现在,我们已经介绍了基础知识,让我们来看一下在for循环中使用断言。
这不仅确保我们希望程序执行所需的操作,而且还可以逻辑地构造代码,以便于阅读。
一个示例–在循环中使用assert
考虑下面的代码,它简单地将给定范围内的整数相加。
我们要确保我们的最终结果始终是积极的,并且不会溢出。
#include <stdio.h> #include <limits.h> #include <assert.h> int loop_function(int a, int b) { //Precondition assertion (a <= b) assert (a <= b); int result = 0; for (int i=a; i<=b; i++) { //Invariant assertion //The cummulative result must always be positive //Sometimes, the result Jan overflow and give a negative //integer. In that case, this assertion will fail assert (result >= 0); result += i; } //Postcondition assertion //Again, the net result must be positive //So if result = 0, this condition will fail assert (result > 0); return result; } int main() { int a = 3; int b = 10; printf("loop_function on %d and %d gives %d\n", a, b, loop_function(a, b)); int c = INT_MAX - 3; int d = INT_MAX; //Here, in case of c and d, the result will overflow. The invariant assertion will be false! printf("loop_function on %d and %d gives %d\n", c, d, loop_function(c, d)); return 0; } </code>
输出
loop_function on 3 and 10 gives 52 assert_loop: assert_loop.c:14: loop_function: Assertion `result >= 0' failed. [1] 337 abort (core dumped) ./assert_loop </code>
如果结果的值太高(超出整数大小),则结果将溢出并变为负数!
我们的第二组输入会执行此操作,因此循环不变断言将失败!
因此,我们的程序将自行停止。
这确保了我们可以检测到程序中的任何设计缺陷,并相应地处理此类输入。