了解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>

如果结果的值太高(超出整数大小),则结果将溢出并变为负数!

我们的第二组输入会执行此操作,因此循环不变断言将失败!

因此,我们的程序将自行停止。
这确保了我们可以检测到程序中的任何设计缺陷,并相应地处理此类输入。