编写代码时,总会做出一些假设,断言就是用于在代码中捕捉这些假设,
可以将断言看成是异常处理的一种高级形式。
c语言assert宏的定义,
#include <assert.h>
void assert(int expression);
意思就是断言表达式expression为真。
如果expression表达式的结果为假,则向stderr打印出错信息并调用abort来终止程序运行。

#undef assert
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
#define _STR(x)  _VAL(x)
#define _VAL(x)  #x
#define assert(expression) ((expression)?(void)0:_assert(__FILE__ ":" _STR(__LINE__) " " #expression))
#endif

使用assert宏时应该要注意:assert只有在debug版本中才生效;在release版本中应该什么都不做。
所谓debug版本,就是程序员调试所使用的版本,这个版本会输出更多的日志信息以便于调试bug;
所谓release版本就是最终交付给客户或用户使用的版本。
通常在用户功能层面来看,debug版本和release版本应该是一样的;
但是release版本因为更高级的优化、更好的日志输出等,所以release版本的程序执行效率会更高。
所以通常使用类似于如下的方式来定义用户自己的assert宏,
#ifdef DEBUG
#define ASSERT(expression) xxx
#else
#define ASSERT(expression) ((void)0)
#endif

当我们认为某个表达式不可能为真的时候,就可以使用assert来判定。
assert可以用来检查指针的有效性、参数的合法性等。
使用assert可以帮助程序员在程序开发阶段就能够尽早的发现错误。

使用assert的一点主意事项:
expression应该足够简单,不要同时检查多个条件,
这样当assert失败时,可以明确的知道哪个条件失败了。

如果assert失败了呢?这个时候程序要怎么执行?
所以光有assert还不够,还要做好程序的出错处理,只有这样写出来的程序才是稳定的健壮的。

以下是一个简单的除法操作案例。
在除法操作中,必须要检查的一件事就是被除数不能为0,否则会发生算术错误。
使用assert,可以帮助程序员在debug版本中查到错误;
release版本中,除了要做被除数检查外,还要做好被除数为0时的出错处理。
因为y=0并不是预期的值,所以即使有了处理处理程序,仍然需要进一步查找y=0的原因。
只有找到了真正的错误根源,并且进行修复,才能进一步提高软件的品质。
int x = 100;
int y = 0;
int sum = 0;

y = get_devide();
assert(y != 0);
if (y != 0)
{
    sum = x / y;
}
else
{
    printf("\nerror, y=0, please to check the reason");
    do_error_handling();
}

关于assert的学习的更多相关文章

  1. java 关键字 assert的学习

    之前在学习java源码时,发现了assert这个不常用的关键字.下面直接来介绍下这个关键字的使用. assert是什么? 它是jdk1.4之后新增加的关键字,没了. assert的作用是什么? ass ...

  2. Python 接口测试(五)

    五:使用python进行组织编写接口测试用例 接口测试其实就是几个步骤. 拿到接口的url地址 查看接口是用什么方式发送 添加请求头,请求体 发送查看返回结果,校验返回结果是否正确 明白了接口测试的测 ...

  3. Requests接口测试(五)

    使用python+requests编写接口测试用例 好了,有了前几章的的基础,写下来我把前面的基础整合一下,来一个实际的接口测试练习吧. 接口测试流程 1.拿到接口的URL地址 2.查看接口是用什么方 ...

  4. C语言学习之assert

    C语言学习之assert assert (编程术语) 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信 ...

  5. python学习笔记 - assert用法

    [转自]http://blog.sina.com.cn/s/blog_76e94d210100vz37.html   1.assert语句用来声明某个条件是真的. 2.如果你非常确信某个你使用的列表中 ...

  6. Nodejs v4.x.0API文档学习(2)Assert断言测试模块

    文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ Assert(断言) assert模块提供了一组简单的断言测试方法,可以拥有测试不变量.该模块 ...

  7. Nodejs学习笔记——Assert(断言)

    Assert - a:actual e:expected m:message o:operator v:value b:block assert.fail(a, e, m, o) assert(v, ...

  8. JavaSE assert断言的学习

    在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语 ...

  9. <assert.h>库学习

    assert的初步认识 assert宏指令是用来诊断程序是否有误的,函数原型如下 void assert(int expression) 那为什么我们要使用assert而不用printf呢?因为ass ...

随机推荐

  1. Codeforces 553D Nudist Beach(图论,贪心)

    Solution: 假设已经选了所有的点. 如果从中删掉一个点,那么其它所有点的分值只可能减少或者不变. 如果要使若干步删除后最小的分值变大,那么删掉的点集中肯定要包含当前分值最小的点. 所以每次删掉 ...

  2. 24种设计模式--装饰模式【Decorator Pattern】

    装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点 ...

  3. 跟我玩ADB——初识ADB

    ADB全称Android Debug Bridge, 是Android SDK的一个可以真实操作手机设备里面内容的工具. 一.功能介绍: 进入设备的shell进行命令行操作 使用5037端口,对设备进 ...

  4. apache2.4配置虚拟目录

    刚开始学习,跟着韩顺平老师的视频课件学习ing~ 这是自己在配置虚拟目录时遇到的问题以及解决办法,记录下来~ ---------------------------分割线君-------------- ...

  5. 学渣也要搞 laravel(3)—— HTTP控制器

    1. laravel 控制器在app/Http/Controllers/ 下,你会看到里面有一个Controller.php ,之后我们创建的控制器都是继承这个总控制器的.创建控制器只需要在这里面添加 ...

  6. C语言学习笔记(一):数组传递时退化为指针

    这几天闲来无事,写了一个数组元素排序函数如下: #include <stdio.h> #include <stdlib.h> void ArraySort(int array[ ...

  7. app上传 需要的icon

    如果提交的ipa包中,未包含必要的Icon就会收到类似的通知,为什么偏偏是Icon-76呢? 因为我们开发的游戏,默认是支持iphone以及ipad的,根据官方提供的参考 Icon-76.png是必须 ...

  8. 10300 - Ecological Premium

    Problem A Ecological Premium Input: standard input Output: standard output Time Limit: 1 second Memo ...

  9. 自己挖坑自己跳 之JsonMappingException: (was java.lang.NullPointerException) (through reference chain:)

    在Web项目中,我们经常会设计一些与界面相对应的JavaBean作为Entity,而为了兼容前台传入的空值,有些字段我们会用包装类型而不是基本类型.可是往往我的Entity已经设计完成,很多时候我们会 ...

  10. c# 把 颜色值Hex 转换为 Color

    原文: http://abujj.me/archives/695 Assuming you mean the HTML type RGB codes (called Hex codes, such a ...