在C编程语言中,0是最为自然的起点。C是从0开始计数的;C用0表示假,用非0表示真;C数组的下标从0开始;C的字符串用0作为结束标志;C的指针用0表示null值;C的外部变量和静态变量在默认情况下被初始化为0。本书解释了C的所有概念,并带你领略用C进行编程的快乐。
C是一种通用的编程语言,最初是在1972年由贝尔实验室的Dennis Ritchie所设计,并在一台PDP-11机器上实现。一开始,它是作为UNIX操作系统的系统语言使用的。早在1970年,UNIX的开发者Ken Thompson曾经用汇编语言和一种称为B的语言编写了早期版本的UNIX。C的发明正是为了克服B的一些限制。
B是一种基于BCPL的编程语言,后者是Martin Richards于1967年所开发的一种无类型系统编程语言。它的基本数据类型就是机器的字,并大量使用了指针和地址运算。这恰好与结构化编程的精神背道而驰。结构化编程的特点就是使用强类型语言,例如与ALGOL类似的语言。C是从B和BCPL发展而来,并吸收了它们的精髓。
在20世纪80年代早期,最初的C语言在增加了void类型、枚举类型以及其他一些改进之后,发展成为我们所熟悉的传统C。20世纪80年代晚期,美国国家标准学会(ANSI)X3J11委员会起草了C的标准,使C进一步发展成为ANSI C(或标准C)。这个委员会在传统C的基础之上增加了void*类型、函数原型和一种新的函数定义语法,并增强了预处理器的功能,使语言的定义更为精确。今天,ANSI C是一种成熟的、通用的编程语言,可以在许多机器和操作系统中使用。它是当今业界所使用的主流编程语言之一,到处都可以看到它的踪影。另外,ANSI C还是C++的基础(C++是一种增加了面向对象特性的编程语言)。本书描述ANSI版本的C语言,同时还对C++和Java的一些话题进行了介绍。
0.1 为什么要用C
C是一种小型语言。在编程中,小即是美。C的关键字要少于Pascal(在这种语言中称为保留字),但它却是一种功能更为强大的语言。C的威力来自于它包含了正确的控制结构和数据类型,并近乎不设限制地允许程序员做他们想做的事情。C的所有威力都是由它的最基本功能拼建而成的。
C是UNIX的本地语言,而UNIX是工作站、服务器和大型机上最主要的交互性操作系统。另外,C也是个人电脑的标准开发语言,MS-DOS和OS/2的许多代码就是用C编写的。许多窗口工具包、数据库程序、图形函数库以及其他类型的大型应用程序都是用C编写的。
C具有可移植性。在一种机器上所编写的代码能够很方便地移植到另一种机器上。C为程序员提供了一个标准的函数库,它们可以在所有类型的机器上使用。另外,C还提供了内置的预处理指令,能够帮助程序员隔离一些依赖于系统的代码。
C非常简洁。C提供了一组功能强大的操作符,有些操作符允许程序员在二进制位的层次上对机器进行访问。许多机器的机器语言都存在和C的自增操作符“++”直接类似的指令,因此这种操作具有非常高的效率。程序员可以在1条语句或1个表达式中组合使用间接访问和地址运算,实现其他语言需要多条语句才能实现的功能。对于许多程序员而言,这种方法既优雅又高效。软件生产率调查表明,程序员平均每天所编写的有效代码数量并不多。因此,简洁的语言可以从根本上提高程序员的效率。
C是模块化的。C只支持一种风格的函数,即外部函数,函数的参数是通过传值方式传递的。C不允许函数的嵌套,它允许程序员通过使用static存储类型实现有限形式的私有性(即限制在文件内部)。这些特性以及操作系统所提供的工具,能够稳定地支持用户定义的函数库和模块化编程。
C是C++和Java的基础。这意味着C程序员平常所使用的结构和方法也可以由C++和Java程序员所使用。因此,学习C也是学习C++或Java的第一步。
C在大多数机器上都具有非常高的效率。由于C的有些结构非常贴近于机器,因此C可以用一种对机器的体系结构而言非常自然的方式来实现。由于这个缘故,经过编译的C代码往往具有极高的效率。当然,程序员必须注意那些依赖于机器的代码。
C也不是没有缺点。它的语法非常复杂,并且它不会自动执行数组的边界检查。有些符号(例如*和=)在C中具有多种不同的含义。例如,一个常见的编程错误就是误用操作符“=”来表示操作符“==”。然而,C是一种优雅的语言,它不会限制程序员对机器的访问。与它的优秀特性相比,C的这些缺点是完全可以接受的。
C的吸引力来自于它所提供的功能强大的操作符以及它不受束缚的本性。C程序员需要努力实现功能的模块化和代码的最简化,并需要进行大量的练习和交互。事实上,练习和交互一直贯穿于本书之中。
0.2 ANSI C标准
ANSI这个缩写代表“美国国家标准学会”(American National Standards Institute)。这个组织致力于为各种系统(包括编程语言)制订标准。ANSI的X3J11委员会专门负责制订C编程语言的标准。20世纪80年代晚期,这个委员会创立了一份标准草案,这就是大家所熟知的ANSI C(或标准C)。1990年,这个委员会完成了它的使命,国际标准化组织(ISO)也批准了ANSI C作为C的标准。因此,ANSI C(或称ANSI/ISO C)便成为广受承认的国际标准。
这个标准指定了用C所编写的程序的形式,并确定了如何对C程序进行解释。这个标准的目的是提高C程序的可移植性、可靠性和可维护性,并保证C程序在各种机器上执行时都能达到非常高的效率。当前,几乎所有的C编译器都遵循ANSI C标准。
0.3 从C到C++
当前,C的应用遍布全球。PC、工作站和大型机上都可以看到它的身影。同时,计算机和操作系统也在不断地发展和演化。对C进行扩展或者限制,让它适用于某个特定的领域显然与C的精神背道而驰。
尽管C语言本身没有进行扩展,但它常常作为其他更高级或更专门的编程语言的核心。Concurrent C通过增加并发元素对C进行了扩展,Objective C通过增加类似Smalltalk风格的对象对C进行了扩展。超级计算机上所使用的有些形式的C则充分利用了这些机器的并行能力。
在这些扩展中,最为重要的是C++,这是一种广为使用的面向对象编程语言。由于它是C的扩展,因此程序员可以在大型软件项目中同时使用C和C++。C程序员也乐于学习C++语言(参见第13章)。
0.4 从C和C++到Java
Java适用于编写在Internet上运行的程序。它允许程序员编写安全、可移植的程序,这些程序可以从Internet下载并在本地机器上运行。这种新的编程语言借鉴于C和C++的一些思想,并致力于使程序以一种独立于机器和系统的方式运行。它的语义是根据虚拟机而设计的,这意味着Java程序在本质上就是可移植的,在各种不同的系统(例如在PC上运行的Windows 95系统以及在工作站上运行的各种UNIX系统)中能够保持一致的行为。
Java常常用于编写Web上由浏览器所使用的Applet。一般情况下,Applet用于提供代码的图形用户接口。由于Java是C和C++的扩展,因此C程序员也乐于学习Java(参见第14章)。
阅读(1403) | 评论(0) | 转发(0) |