虽然前四章已经讲了大量能够影响程序指令序列的控制流程的语句,这些常见的语句也能够大多数常见的编程任务,然而,一些并不常见的部分对许多应用程序也很重要。
递归:经常用相似的定义来反映数据结构和算法。简单的说,递归就是函数的自身调用。许多数据结构——如树和堆,操作——如类型判断和类型和一,数学实体——如裴波纳戚数和分形图,以及算法——如快速排序、数遍历和递归下降分析,都采用递归定义。递归并不是死循环!
异常:在C++和java中采用组织对错误的处理,或者有效地使用多处理器的计算机。Java的异常处理代码可能包括:try块中的一系列语句,其中发生的异常可以捕获;0或多个catch子句,当异常发生时,将这些字句进行匹配;一个可选的的finally子句块,总是在try之后执行。
当并行机制不可用时,程序可能必须采用异步信号(能够在任意时间发出的信号)和非局部跳转来响应外部事件。为了提高效率,程序员往往在平常调用C函数的地方使用C语言预处理的宏替换功能。
大型的多个项目文件与小型项目之间的不同:
- 项目的组织。开发多平台应用程序的一个通常策略就是将平台相关的代码隔离开来,针对每种平台进行定制。然后,将这些代码放入分离的目录中:依据目标平台,配置其中的某一个参与到编译过程中。一句体系大小的不同,我们我们描述的目录可能适用于整个系统,或者系统中每个部分都有自己独立的目录结构。在浏览大型的项目时要注意,项目的源码远不止是编译后获得可执行程序的计算机语言指令:一个项目的源码树一般还包括规格说明、最终用户和开发人员文档、测试脚本、多媒体资源、编译工具、例子、本地化文件、修订历史、安装过程和许可信息。
- 在运行期间读人的配置数据可以自由的被终端用户操作。因此,程序应该像对待其他用户输入一样,仔细的对他进行验证,同时在较高安全特权下运行的程序,应该保证不让他的任何函数允许无特权的用户使用。
- 我们可以将系统的源代码想象成在时间和空间两个方向上延伸。代码,组织成文件和目录的形式,占据空间,同时,统一代码还随着时间的推移不断演化。修订控制系统可以跟踪代码的演化,标记重大事件,并记录更改之后的原因,允许我们查看和控制时间的要素。