【快速学习系列 - 阅读笔记 - 01】《C程序设计与错误分析》

1)结构允许有字段成员,而字段不能做联合成员。

注1:结构体(struct)是用户自定义的可用的数据类型,允许存储不同类型的数据项目。

注2:联合体(union)是与结构体相似的一种数据类型,同样可用于存储不同类型的数据项目,区别在于所存储的数据项目共用一块儿存储空间。

注3:位字段是以bit为单位的,其大小为char类型的1/8。

由上述定义可知,字段成员的定义是为了能够精细划分存储的位置,而由于联合体中的所有数据成员共用相同的存储空间首地址,故不能定义字段成员。

2)由于在输入时要将ASCII码转为二进制,输出时又要将二进制转为字符,费时较多,因此在内存与磁盘频繁交换数据的情况下,最好不要使用fprint和fscanf函数,而用fread和fwrite函数。

注1:由于计算机只能够处理二进制数据内容,而现实世界中使用的最小表达和理解单位为字符,字符通常对应到ASCII编码,所以就会存在字符与二进制之间的转换过程,以便于现实世界与计算机世界的数据交互。

注2:fprintf是将二进制数据转换为字符再写入文件;fwrite是直接将二进制数据写入文件。例如,将int型的整数65写入文本文件,使用fprintf时,会将65分为6和5两个字符,然后转换为对应的ASCII码,即54和53,然后写入文件;而使用fwrite时,则直接将65对应的二进制数据1000001写入文件。

3)不要在同一程序中混合使用两类I/O系统,其调用文件的方式不同,可能会相互干扰。

注1:此处的两类I/O系统实指fread/fwrite和fprintf/fscanf的使用。

4)设计大型程序的常用方法:模块化程序设计;分块编译;头部文件;工程文件;库的建立与管理。

注1:在一个大型的项目程序中,这几种方法基本都会同时使用。模块化程序设计有助于项目需求功能的整理和验证;分块编译有助于开发的并行化;头部文件有助于接口的清晰化管理;工程文件有助于项目的开发管理;库的建立与管理有助于项目的功能扩展和延伸。

5)开发中需要注意的问题:变量与函数的传递问题,在一个编译单元中可以使用其它编译单元中的变量,可供其它单元应用的变量,必须定义缺省存储类型的全局变量,在一个编译单元中引用其它编译单元所定义的变量时,该变量必须被说明为extern型变量;库函数,熟悉库函数,编写自己的库函数;混合模式编程;混合语言编程;系统功能调用,包括对操作系统的功能调用和基本输入输出功能调用,提高程序的开发效率和质量,完成复杂的程序功能;预处理,常用#include和#define,使用预编译功能有利于提高程序的可移植性,增加程序的灵活性;C语言工具;程序的测试,软件测试过程需要经历模块测试、组装测试、确认测试三个步骤,测试工作量可能占软件开发工作量的40%~50%,甚至80%。

注1:在实际项目中经常见到定义大量的全局变量以及extern型变量的情况,如此做法会导致各个模块之间的耦合性增加,有违高内聚低耦合的开发原则。

6)头文件可由下面的内容组成:宏定义;可以把常数、类型定义等放在头文件中;还可以包含库函数的头文件,即嵌套嵌入;可把全局变量放在头文件中。

7)模块测试主要评价模块的5个特性:模块接口;模块内部的数据结构;重要的执行路径;错误的处理路径;影响上述几点的边缘条件。

注1:模块接口应当秉持单一原则,每个功能定义一个对应的接口;另外,需要注意接口命名和参数命名的明晰性,使其功能含义一目了然。

8)在开始其它任何测试之前,必须首先测试贯穿模块入口和出口的数据流。

注1:通过测试出入口的数据流,可以首先确定该模块功能的正确性。

9)程序测试方法:单独测试各个模块,可以全面测试各个函数,测试容易控制,测试数据容易构造;自顶向下测试,先构造一些虚构函数,把这些函数的虚构过程加入测试程序,再逐渐用实际函数代替虚构过程;自底向上测试,先测试底层函数,再测试调用它们的函数;整体测试。

注1:关于测试手法和测试顺序,属于仁者见仁智者见智,能够达到确保功能和流程正确的目的即可;测试时,尽量先考虑自动化的测试手段,一方面节省时间和精力,另一方面准确性更加有保证。

10)好的测试数据文件应满足:必须覆盖所有可能情况;能够准确地理解文件中所包含的内容;测试结果容易辨认。

注1:首先需要整理出各种Use Case,即各种需要测试的可能情况。

11)程序错误基本上有三种类型:必须修改的错误;愿意去修改的错误;感到有些疑点的错误。

12)在测试之前,必须理解究竟要证明什么、测试什么和怎样测试。

注1:首先制定测试计划和测试用例。

13)常见错误一般可以分为:语法错误、程序设计错误、潜在错误及编译配合错误。

注1:潜在错误一般在运行时方可发现,其它错误基本可以在编译阶段发现。

14)使用函数时易犯的典型错误包括:函数参数说明的位置不对;主函数与被调用的函数搭配不对;变量传递给函数;忘记要对调用函数的参数进行说明;正确地对main函数中所调用的函数加以说明。

15)C语言中规定一个字符串常数用空字符(’\0’)作为结束标志,而且代表了内存中的一个区域中的地址。

16)不能够直接把一个数组传递给一个函数,应把数组参数说明转换成对应的指针说明。

注1:涉及变量传递的基本原则,传递变量存储地址。

17)引用库函数时的首要条件是使用系统头文件。

注1:库函数通过头文件提供其功能接口说明。

18)避免语法错误的有效措施:细分过程函数;尽量使用函数原型;弄清楚各个模块的配合关系;检查配合关系及边界条件;避免隐患;保证设计的意图清楚;对程序进行保护性设计,保护性编码的含义是把反复使用较多的部分放到函数调用中;注意自己的空间,不用引用不属于自己的空间,不要向静态或全局变量存储区传递数据。

注1:多多提取公共代码部分,进行单独封装,以便于提高代码的复用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值