参考链接: C labs()
本系列内容基本保证一天一更,大家努力哦。
本章内容包括:
C语言和C 的发展历史和基本原理。过程性编程和面向对象编程。C 是如何在C语言的基础上添加面向对象概念的。C 是如何在C语言的基础上添加泛型编程概念的。编程语言标准。创建程序的技巧。
1.1 c 简介
c 融合了3种不同的编程方式:C语言代表的过程性语言、c 在c语言基础上添加的类代表的面向对象语言、c 模板支持的泛型编程。
使用c 的原因之一是为了利用其面向对象的特性。要利用这种特性,必须对标准c语言知识有较深入的了解,因为它提供了基本类型、运算符、控制结果和语法规则。所以,如果已经对c有所了解,便可以学习c 了,但这并不仅仅是学习更多的关键字和结构,从c过渡到c 的学习量就行从头学习C语言一样大。另外,如果先掌握了C语言你,则在过渡到c 时,必须摒弃一些编程习惯。如果不了解C语言,则学习时需要掌握C语言的知识、OOP知识以及泛型编程知识,但无需摒弃任何编程习惯。从入门到放弃,做好准备吧。
1.2 c 简史
在20世纪70年代,我们大部分人都没出生的年代,C和Pascal这样的语言引领人们进入了结构化编程时代,这种机制把秩序和规则带进了迫切需要这种性质的领域中。除了提供结构化编程工具外,C还能生成简介、快速运行的程序,并提供了处理软件问题的能力,如管理通信端口和磁盘驱动器。这些因素使C语言成为20世纪80年代占统治地位的编程语言。同时,20世纪80年代,人们也见证了一种新编程模式的成长:面向对象编程(OOP)。
SmallTalk和C 语言具有这种功能。下面更深入地介绍C和OOP。
1.2.1 C语言
20世纪70年代早期,贝尔实验室的Dennis Ritchie致力于开发UNIX操作系统(操作系统是能够管理计算机资源、处理计算机与用户之间交互的一组程序。例如,操作系统将系统提示符显示在屏幕上以提供终端式界面、提供管理窗口和鼠标的图形界面以及运行程序)。为完成这项工作,Ritchie
需要一种语言,它必须简洁,能够生成简洁、快速的程序,并能有效地控制硬件。
传统上,程序员使用编汇语言来满足这些需求,编汇语言依赖于计算机的内部机器语言。然而,汇编语言是低级(low-level)语言,即直接操作硬件,如直接访问CPU寄存器和内存单元。因此汇编语言针对于特定的计算机处理器,要将编汇程序移植到另一种计算机上,必须使用不同的编汇语言重新编写程序。这有点像每次购买新车时,都发现设计人员改变了控制系统的位置和功能,客户不得不重新学习驾驶。
然而,UNIX是为在不同的计算机(或平台)上工作而设计的,这意味着它是一种高级语言。高级(high-level)语言致力于解决问题,而不针对特定的硬件。一种被称为编译器的特殊程序将高级语言翻译成特定的计算机的内部语言。这样,就可以通过对每个平台使用不同的编译器来在不同的平台上使用同一个高级语言了。Ritchie希望有一种语言能够将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起,于是他在旧语言的基础上开发了C语言。
1.2.2 C语言编程原理
一般来说,计算机语言要处理两个概念——数据和算法。数据是程序使用和处理的信息,而算法是程序使用的方法。程序命令计算机按一系列流程生成特定的结果,就像菜谱指定了厨师做蛋糕时应遵循的一系列步骤一样。
随着程序规模的扩大,早期的程序语言(如FORTRAN和BASIC)都会遇到组织方面的问题。例如,程序经常使用分支语句,根据某种测试的结果,秩序一组或另一组指令。很多旧式的程序的执行路径很混乱(被称为“意大利面条式编程”),几乎不可能通过阅读程序来理解它,修改这种程序简直是一场灾难。为了 解决这种问题,计算机科学家开发了一种更为有序的编程方法——结构化编程(structured programming)。C语言具有使用这种方法的特性。例如,结构化编程讲分支(决定接下来执行哪个指令)限制为以小组行为良好的结构。C语言的词汇表中就包含了这些结构(for循环、while循环、do while 循环和if else 语句)。
另一种新原则是自顶向下(top-down)的设计。在C语言中,其理念是将强大的程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。这一过程将一直持续下去,直到将程序划分为小型的、易于编写的模块(整理一下书房。先整理桌子、桌面、档案柜,仍然会整理书架。好,先从桌子开始,然后整理每个抽屉,从中间的那个抽屉开始整理。也许我都可以管理这项任务。)。C语言的设计者有助于使用这种方法,它鼓励程序员开发程序单元(函数)来表示各个任务模块。综上,结构化编程技术反映了过程性编程的思想。
1.2.3 面对对象编程
虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍面临着挑战。为应付这种挑战,OOP提供了一种新方法。与强调算法的过程性编程不同的是,OOP强调的是数据。OOP不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。其理念是设计与问题的本质特性相对于的数据结格式。
在C 中,类是一种规范,它描述了这种新型数据的格式,对象时根据这种规范构造的特点数据结构。
OOP程序设计方法首先设计类,他们准确地表示了程序要处理的东西。例如,绘图程序可能定义表示矩形、直线、圆、画刷、画笔的类。类定义描述了对每个类可执行的操作,如移动圆或旋转直线。然后您便可以设计一个使用这些类的对象的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫做自下而上(bottom-up)的编程。
OOP编程并不仅仅是将数据和方法合并为类定义。例如,OOP还有助于创建可重用的代码,这将减少大量的工作。信息隐藏可以保护数据,使其免遭不适当的访问。多态让您能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。继承让您能够使用旧类派生出新类。正如接下来将看到的那样,OOP引入了很多新的理念,使用的编程方法不同于过程性编程。它不是讲重点放在任务上,而是放在表示概念上。有时不一定使用自上而下的编程方法,而是使用自下向上的 编程方法。
设计有用、可靠的类是一项艰巨的任务,幸运的是,OOP语言是程序员咋爱编程中能够轻松地使用已有的类。厂商提供了大量有用的类库,包括设计用于简化Windows或Macintosh环境下编程的类库。C 真正的优点之一是:可以方便的重用和修改现有的、经过仔细测试的代码。
1.2.4 C 和泛型编程
泛型编程(generic programming)是C 支持的另一种编程模式。它与OOP的目标相同,即使重用代码和抽象通用概念的技术更简单。不过OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型。它们的侧重点不同。OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务(如对数据排序或合并链表)的工具,术语泛型(generic)指的是创建独立于类型的代码。C 的数据表示有多种类型——整数、小数、字符、字符串、用户定义的、有多种类型组成的复合结构。例如,要对不同类型的数据进行排序,通常必须为每种类型创建一个排序函数。泛型编程需要对语言进行扩展,以便可以只编写一个泛型(即不是特定的类型)函数,并将其用于各种实际类型。C 模板提供了完成这种任务的机制。
1.2.5 C 的起源
与C语言一样,C 也是再贝尔实验室诞生的,Bjarne Stroustrup于20世纪80年代在这里开发出了这种语言。用他自己的话来说,“C 主要是为了我的朋友和我不必再使用汇编语言、C语言或者其他现代高级语言来编程而设计的。它的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐”。
Bjarne Stroustrup 设计并实现了C 编程语言,他是权威参考手册《The C Programming Language》和《The design and Evolution of C 》的作者。推荐他位于AT&T Labs Research 上的个人网站作为首选的C 书签:
http://www.research.att.com/-bs/
Stroustrup比较关心的是让C 更有用,而不是实施特定的编程原理或风格。在确定c 语言特性方面,真正的编程需要比纯粹的原理更重要。Stroustrup之所以在c的基础上创建c ,是因为C语法简洁、适合系统编程、使用广泛且于UNIX操作系统联系紧密。C 的OOP方面收到了计算机模拟语言Simula67的启发。Stroustrup加入了OOP特性和对C的泛型编程支持,但并没有对C的组件作很大改动。因此。C 是C语言的超集,这意味着任何有效的C程序都是有效的C 程序。它们之间有些细微的差异,但无足轻重。C 程序可以使用已有的C软件库。库数编程模块的集合,可以从程序中调用它们。库对很多常见的编程问题提供了可靠的解决方法,因此能节省程序员大量的时间和工作量。这也有助于c 的传播。
名称C 来自C语言中的递增运算符 ,该运算符将变量加1。名称C 表面,它是C的扩充版本。
计算机程序将实际问题转换为计算机能够执行的一系列操作。OOP部分赋予了C 语言将问题所涉及的概念联系起来的能力,C部分赋予了C 语言紧密联系硬件的能力,这种能力上的结合成就了C 广泛的传播。从程序的一个方面转到另一个方面时,思维方式也要跟着转换(确实,有些OOP正统派吧为C添加OOP特性看作是为猪插上翅膀,虽然这是头骨瘦嶙峋、非常能干的猪)。另外,C 是把C语言的基础上添加OOP特性,您可以忽略C 面向对象特性,但将错过很多有用的东西。
在C 获得一定程度的成功后,Stroustrup才添加了模板,这使得进行泛型编程成为可能。在模板特性被使用和改进后,人们才逐渐认识到,它们和OOP同样重要——甚至比OOP还重要,但有些人不这么认为。C 融合了OOP、泛型编程和传统的过程性的方法,这表明C 强调的是实用价值,而不是意识形态方法,这也是该语言获得成功的原因之一。
第二节链接:
点击打开链接