angrypanda吧 关注:86贴子:1,097
  • 2回复贴,共1

错误判断函数

只看楼主收藏回复

assert()函数判断可能的错误是否发生,如果发生,程序终止执行,不发生则正常执行。函数在有可能出错的地方测试一个条件,当条件成立时,表示发生错误。
语法 void assert(int test);
test为待测试表示式。
assert()函数为无返回值。
示例 本示例通过一个数除零引发错误。当为b输入0时,结果如图2.1所示,其他数据正常运算。
#include<stdio.h>
#include<assert.h>
main()
{ double a,b,c;
printf("input two integer:");
scanf("%lf%lf",&a,&b); /*输入两个数*/
assert(b!=0) /*当b不得0时向下执行,得0时终止程序*/
c=a/b; /*计算两数相除的结果*/
printf("%lf",c);
}


IP属地:黑龙江来自Android客户端1楼2015-08-07 08:35回复
    assert的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
    #include <assert.h>
    void assert( int expression );
    assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
    assert()函数有个缺点,就是频繁的调用会极大的影响程序的性能,增加额外的开销。
    在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。
    示例代码如下:
    #include <stdio.h>
    #define NDEBUG
    #include <assert.h>
    用法总结与注意事项:
    1、检验传入参数的合法性:
    void my_strcpy(char *to,const char *from,int size)
    {
      assert(to);assert(from);
      ...
    }
    2、每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败:
    不好:
    assert(to && from);
    好:
    assert(to);assert(from);
    3、不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题:
    错误:
    assert(i++ < 100);
    这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
    正确:
    assert(i < 100);
    i++;
    4、有的地方,assert不能代替条件过滤。
    assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。
    一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。


    IP属地:北京2楼2015-08-09 13:41
    收起回复