Assertion (software development) -- 断言
In computer programming, an assertion is a predicate (a true–false statement) placed in a program to indicate that the developer thinks that the predicate is always true at that place. If an assertion evaluates to false at run-time, an assertion failure results, which typically causes execution to abort.
在程式設計中,斷言(assertion)是一種放在程式中的一階邏輯(如一個結果為真或是假的邏輯判斷式),目的是為了標示與驗證程式開發者預期的結果-當程式執行到斷言的位置時,對應的斷言應該為真。若斷言不會真時,程式會中止執行,並出現錯誤訊息。
Programmers can use assertions to help specify programs and to reason about program correctness. For example, a precondition—an assertion placed at the beginning of a section of code—determines the set of states under which the programmer expects the code to execute. A postcondition—placed at the end—describes the expected state at the end of execution.
程式設計者可以用斷言來標示程式,提供程式正確性的相關資訊。例如在一段程式前加入斷言(先驗條件),說明這段程式執行前預期的狀態。或在一段程式後加入斷言(後驗條件),說明這段程式執行後預期的結果。
In languages such as Eiffel, assertions form part of the design process; other languages, such as C and Java, use them only to check assumptions at runtime. In both cases, they can be checked for validity at runtime but can usually also be suppressed.
在開發Eiffel語言的程式時,斷言是設計過程中的一部份。像C語言或Java等程式語言,主要在執行期檢查斷言是否正確,也可以用靜態斷言的方式,在編譯期檢查斷言。不論是哪一種情形,都可以檢查斷言的有效性,也可以關閉斷言檢查的機能。
1、编程断言:
- assert Expression1
- assert Expression1:Expression2
- 使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
- 使用断言对函数的参数进行确认。
- 在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
- 一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
assert()是一个诊断宏,用于动态辨识程序的逻辑错误条件。其原型是:#include "assert.h"
void assert( int expression );
如果宏的参数求值结果为非零值,则不做任何操作(no action);如果是零值,用宽字符打印诊断消息,然后调用abort()。诊断消息包括:
- 源文件名字(在
stdlib.h中声明的宏__FILE__的值) - 所在的源文件的行号(在
stdlib.h中声明的宏__LINE__的值) - 所在的函数名(在stdlib.h中声明的宏
__func__的值),这是C99新增的特性 - 求值结果为0的表达式
诊断信息的显示目标依赖于被调用程序的类型。如果是控制台程序,诊断信息显示在stderr设备;如果是基于窗口的程序,assert()产生一个Windows MessageBox来显示诊断信息。
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include
#define NDEBUG
#include
Assertion (software development) -- 断言的更多相关文章
- [转] Agile Software Development 敏捷软件开发
原文作者:kkun 原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷是什么 ...
- 敏捷软件开发 Agile software Development(转)
原文链接: http://www.cnblogs.com/kkun/archive/2011/07/06/2099253.html 敏捷软件开发 Agile software Development ...
- Agile software Development
转自:https://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷软件开发 Agile soft ...
- 关于敏捷开发方法(Agile Software Development)的阅读笔记
对“敏捷开发”(Agile Software Development)这个词,我是在这学期邹欣老师<现代程序设计>课上第一次听到的,刚听到时并不知道其具体指什么,只是从字面上直觉其意思应该 ...
- [英中双语] Pragmatic Software Development Tips 务实的软件开发提示
Pragmatic Software Development Tips务实的软件开发提示 Care About Your Craft Why spend your life developing so ...
- 软件开发流程 Software development process
软件开发流程(Software development process)即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法.软件的总体结构设计和模块设计.编程和调试.程序联调和测试以 ...
- [software development] 需求分析checklist
[software development] 需求分析checklist // */ // ]]> [software development] 需求分析checklist Table of ...
- Software Development Engineer - Database Services
http://stackoverflow.com/jobs/116486/software-development-engineer-database-services-amazon?med=clc& ...
- 微软职位内部推荐-Software Development Engineer
微软近期Open的职位: Job Title: Software Development Engineer Work Location: Suzhou, China The Office 365 Co ...
随机推荐
- eclipse 配置maven 项目tomcat 运行
- C++ x86程序与x64程序中,各种内置类型的大小比较
代码: #include <iostream> #include <cstdio> #include <list> #include <string> ...
- 应用程序池和应用程序域的区别(Difference between application pool and application domain)
来自StackOverFlow: http://stackoverflow.com/questions/8486335/difference-between-an-application-domai ...
- java 发送html邮件,苹果或者某些邮件客户端收到的内容为空白解决方案
需要把网页标签中的双引号替换为 " 或者 \\\" 例如 <div id=\\\"container\\\" style=\\\"widt ...
- 为每一个应用程序池单独设置aspnet.config配置文件
ASP.NET2.0之后的版本号就在各Framework的根文件夹下提供了一个aspnet.config文件.这个文件用来配置全局的一些信息,可是一直以来我们都没有怎么用过. ASP.NET4.0之后 ...
- word转pdf
很多人在工作经常会遇到word转pdf功能,word转pdf还是比较复杂,网上各种包,如python的各种转换包,其实是存在很多问题 的,尤其是对比较复杂的格式,真正的还的是调用组件来转换,这里介绍的 ...
- MySQL学习总结(五)表数据查询
查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高.最重要的数据操作. 1.单表数据记录查询 1.1.简单数据查询 SELECT field ...
- PHP,mysql,Linux,CI框架学习总结
PHP,mysql,CI框架学习总结 PHP标记 1.Xml风格<?php ?> 2.简短风格 <? ?> 需在php.ini中开启short_open_tag 3.asp风格 ...
- android-gradle-深入浅出-五:build type
默认情况下,Android插件自动为项目构建一个debug和一个release版本的应用.这两个版本的不同主要体现在在非开发机上的调试功能以及APK的签名方式.debug版本使用一个用公开的name/ ...
- Linux的Samba服务器
1.samba服务器概述 Samba最先在Linux和windows两平台之间架起一座桥梁,正是由于samba的出现,我们可以在Linux系统和Windows系统之间相互通信,比如拷贝文件,实现不同操 ...