学科分类
目录
C语言

断言的作用

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()函数被调用终止了程序运行。

需要注意的是,使用断言可有效查找程序错误根源,但是,断言一次只能检测一个条件。如果有多个条件需要检测,则需要多次使用断言,但频繁使用断言会增加程序开销,降低程序的运行效率。此外,断言失败会强制终止程序,不适合嵌入式程序和服务器程序。断言检查只能作为程序调试的辅助条件,不能代替条件检测。

点击此处
隐藏目录