hb6.org
域名年龄: 15年6个月18天HTTP/1.1 200 OK 访问时间:2019年06月25日 10:50:39 缓存控制:no-store, 不缓存,必须更新, post-check=0, pre-check=0 其他指令:不缓存 X-Pingback: http://www.hb6.org/xmlrpc.php 设置Cookie:PHPSESSID=6a0dd9bf456e880948d49ec213993409; path=/ Upgrade: h2,h2c 连接:Upgrade, Keep-Alive 动作:Accept-Encoding Content-Encoding: gzip Keep-Alive: timeout=5, max=75 Transfer-Encoding: chunked 类型:text/html; charset=UTF-8 网站编码:UTF-8
这个M书写是对思维的缓存MenuSkip to content首页友链貘电台关于搜索:《C语言接口与实现》Chapter2笔记Posted on2014/07/10· Leave a comment模块分为两个部分,即模块的接口与实现。接口规定了模块做什么(声明标识符、类型和历程)。实现指明模块如何完成其接口规定的目标。客户端程序(client)是使用模块的一端代码(导入接口,实现导出接口)。多个客户端共享接口和实现,因而避免了不必要的代码重复。一、接口接口仅规定客户程序可能使用的那些标识符,尽而可能隐藏不想管的表示细节和算法。客户程序和实现之间的这种依赖性称之为耦合(coupling),在实现改变时耦合会导致bug,当依赖性被与实现相关的隐藏或隐含的假定掩盖时,这种bug会难于改正。在C语言中,接口通过一个头文件指定,头文件的扩展名通常为.h。这个头文件会声明客户程序可能是用的宏、类型、数据结构、变量和例程。用C预处理命令#include导入。一个接口例子:1234567<arith.h> ≡ extern int Arith_max(int x, int y); extern int Arith_min(int x, int y); extern int Arith_div(int x, int y); extern int Arith_mod(int x, int y); extern int Arith_ceiling(int x, int y); extern int Arith_floor(int x, int y);该接口命名为Arith,接口头文件命名为arith.h。避免名称碰撞(name collision)的一个方法是使用前缀,如模块名。Arith接口中函数提供了标准C库缺失的一些有用功能,并对除法和模运算提供了良定义的结果,而标准则将这些操作的行为规定为未定义(undefined)或由具体实现来定义(implementation-define)。C语言标准只是强调,如果x/y是可以表示的,那么(x/y)*y + x%y必须等于x,因而内建的运算符只对正的操作数有用。标准库函数div和ldiv以两个整数或长整数为输入,并计算二者的商和余数,在一个结构的quot和rem字段中返回。它们是良定义的——总是向零舍入。arith_div和arith_mod,它们也是良定义的——总是向数轴的左侧舍入。arith_div(x, y)的定义为超过实数z的最大整数,而z*y=x。arith_mod(x, y)则等于x – y*arith(x, y)。arith_ceiling(x, y)返回不小于x/y的实数商的最小整数。arith_floor(x, y)返回不大于x/y的实数商的最大整数。二、实现123456789101112<arith.c> ≡ #include "arith.h"<arith.c functions 14><arith.c functions 14> ≡ int Arith_max(int x, int y) {return x > y ? x : y;}int Arith_min(int x, int y) {return x > y ? y : x;}在Arith_div中,如果除法向零舍入,而y不能整除x,那么Arith_div(x, y)的结果为x/y-1,否则,返回x/y:12345678<arith.c functions 14> +≡ int Arith_div(int x, int y) {if (<division truncates toward 0 14>)&& <x and y have different signs 14> && x % y != 0)return x/y - 1;elsereturn x/y;}测试除法所采用的舍入方式:12<division truncates toward 0 14> ≡ -13/5 == -2检查符号问题(首先判断x和y是否小于0,然后比较结果是否相等):12<x and y have different signs 14> ≡ <x < 0> != (y < 0)Arith_mod可以用Arith_div那样进行判断,也可以用%运算符实现:12345678<arith.c functions 14> +≡int Arith_mod(int x, int y) {if (<division truncates toward 0 14>&& <x and y have different signs 14> && x%y != 0)return x%y + y;elsereturn x%y;}Arith_floor刚好等于Arith_div,而Arit_ceiling等于Arith_div加1,除非y能整除x:12345678<arith.c functions 14> +≡int Arith_floor(int x, int y) {return Arith_div(x, y);}int Arith_ceiling(int x, int y) {return Arith_div(x, y) + (x%y != 0);}三、抽象数据类型一个抽象数据类型是一个接口,它定义了一个数据类型和对该类型的值的所进行的操作。一个数据类型是一个值的集合。以下接口定义了栈类型及其五个操作,:123456789101112131415<initial versiob of stack.h> ≡#ifndef STACK_INCLUDED#define STACK_INCLUDED#define T Stack_Ttypedef struct Stack_T * Stack_T;extern Tstack_new(void);extern intStack_empty(T stk);extern void*Stac_pop(T stk, void *x);extern voidStack_pust(T stk);extern voidStack_free(T *stk);#undef T#endif结构、联合和枚举的名称(标记)占用了一个命名空间,该命名空间不同于变量、函数、和类型名所用的命名空间。宏后加_INCLUDED有助于避免冲突。标准C将下划线前缀保留给实现者和未来扩展使用,因此要避免使用下划线前缀。条件编译指令#ifdef 和#endif以及定义STACK_INCLUDED的#define,使之stack.h可以被包含多次也能避免重定义的错误。定义ADT的接口X可以将ADT类命名为X_T,更进一步在接口内部用宏将X_T缩写为T,结尾用#undef删除上述缩写。该接口提供了可用于
© 2010 - 2020 网站综合信息查询 同IP网站查询 相关类似网站查询 网站备案查询网站地图 最新查询 最近更新 优秀网站 热门网站 全部网站 同IP查询 备案查询
2025-03-08 11:31, Process in 0.0066 second.