断言的作用
C语言中的断言使用宏assert()实现,assert()的声明格式如下所示:
void assert( int expression );
assert()接受一个表达式expression作为参数,如果表达式值为真,继续往下执行程序,如果表达式值为假,assert()会调用abort()函数终止程序的执行,并提示失败信息。
需要注意的是,assert()宏定义在assert.h库文件中,使用assert()宏进行断言时,要包含assert.h标准库。
接下来通过一个案例演示断言的使用,在该案例中,定义一个func()函数计算两个整数相除的结果。在调用该函数时,不希望函数接受0作为除数,为了检测函数接受的除数是否为0,可以在函数中增加一条断言,如例1所示。
例1 assert.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3 #include <assert.h> //包含assert.h标准库文件
4 int func(int a, int b) //定义func()函数
5 {
6 assert(b != 0); //断言除数b是否为0
7 return a / b;
8 }
9 int main()
10 {
11 int x, y;
12 printf("请输入两个整数:");
13 scanf("%d%d", &x, &y);
14 int result = func(x, y); //调用func()函数
15 printf("两个数相除结果:%d\n", result);
16 return 0;
17 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第4~8行代码定义了func()函数,并使用assert断言除数b是否为0;第11~13行代码定义了两个整型变量x与y,并调用scanf()函数从键盘输入两个整数;第14行代码调用func()函数并将x、y作为参数传入;第15行代码调用printf()函数输出两个整数相除的结果。由图10-9可知,当输入两个整数10、20时,程序输出其结果为0。
但是,当输入除数为0时,程序就会报错,并弹出错误提示框,运行结果与错误提示框分别如图2和图3所示。
图2 例1输入除数为0运行结果
图3 例1输入除数为0时的错误提示框
由图2可知,当输入除数b为0时,程序断言失败:b!=0,并且显示断言失败的文件为assert.c,断言的代码行号为6。由3可知,程序在assert.exe在运行时出错,abort()函数被调用终止了程序运行。
需要注意的是,使用断言可有效查找程序错误根源,但是,断言一次只能检测一个条件。如果有多个条件需要检测,则需要多次使用断言,但频繁使用断言会增加程序开销,降低程序的运行效率。此外,断言失败会强制终止程序,不适合嵌入式程序和服务器程序。断言检查只能作为程序调试的辅助条件,不能代替条件检测。