编程学习biancheng.45soft.com 本站提供了各种在线教程和资料,供大家学习与参考.
编程学习
当前位置: 主页 > C语言 >

C语言 教程


C 语言是一种通用的程序设计语言。它同 UNIX 系统之间具有非常密切的联系 ——C 语言是在 UNIX 系统上开发的,并且,无论是 UNIX 系统本身还是其上运行的大部分程序,都是用 C 语言编写的。但是, C 语言并不受限于任何一种操作系统或机器。由于它很适合用来编写编译器和操作系统,因此被称为 “ 系统编程语言 ” ,但它同样适合于编写不同领城中的大多数程序。


C 语言的很多重要概念来源于由 Martin Richards 开发的 BCPL 语言。 BCPL 对 C 语言的影响间接地来自于 B 语言,它是 Ken Thompson 为第一个 UNIX 系统而于 1970 年在 DEC PDP-7 计算机上开发的。


BCPL 和 B 语言都是 “ 无类型 ” 的语言。相比较而言, C 语言提供了很多数据类型。其基本类型包括字符、具有多种长度的整型和浮点数等。另外,还有通过指针、数组、结构和联合派生的各种数据类型。表达式由运算符 和操作数组成任何一个表达式,包括赋值表达式或函数调用表达式,都可以是一个语句。指针提供了与具体机器无关的地址算术运算。


C 语言为实现结构良好的程序提供了基本的控制流结构:语句组、条件判断( if-else )、多路选择( switch )、终止测试在顶部的循环( while 、 for )、终止测试在底部的循环( do )、提前跳出循环( break )等。


函数可以返回基本类型、结构、联合或指针类型的值。任何函数都可以递归调用。局部变量通常是 “ 自动的 ” ,即在每次函数调用时重新创建。函数定义可以不是嵌套的,但可以用块结构的方式声明变量。一个 C 语言程序的不同函数可以出现在多个单独编译的不同源文件中。变量可以只在函数内部有效,也可以在函数外部但仅在一个源文件中有效,还可以在整个程序中都有 效。 编译的预处理阶段将对程序文本进行宏替换、包含其它源文件以及进行条件编译。


C 语言是一种相对 “ 低级 ” 的语言。这种说法并没有什么贬义,它仅仅意味着 C 语言可以处理大部分计算机能够处理的对象,比如字符、数字和地址。这些对象可以通过具体机器实现的算术运算符和逻辑运算符组合在一起并移动。


C 语言不提供直接处理诸如字符串、集台、列表或数组等复合对象的操作。虽然可以将整个结构作为一个单元进行拷贝,但 C 语言没有处理整个数组或字符串的操。除了由函数的局部变量提供的静态定义和堆栈外, C 语言没有定义任何存储器分配工具,也不提供堆和无用内存回收工具。最后, C 语言本身没有提供输入/输出功能,没有 READ 或 WRITE 语句,也没有内置的文件访问方法,所有这些高层的机制必须由显式调用的函数提供。 C 语言的大部分实现已合理地包含了这些函数的标准集合。


类似地, C 语言只提供简单的单线程控制流,即测试、循环、分组和子程序,它不提供多道程序设计、并行操作、同步和协同例程。


尽管缺少其中的某些特性看起来好像是一个严重不( “ 这意味着必须通过调用函数来比较两个字符串吗? ” ),但是把语言保持在一个适度的规模会有很多益处。由于 C 语言相对较小,因此可以用比较小的篇幅将它描述出来,这样也很容易学会。程序员有理由期望了解、理解并真正彻底地使用完整的语言。


很多年来, C 语言的定义就是《 The C Programming Language 》第 1 版中的参考手册。 1983 年,美国国家标准协会( ANSI )成立了一个委员会以制定一个现代的、全面的 C 语言定义。最后的结果就是 1988 年完成的 ANSI 标准,即 “ANSI C” 。该标准的大部分特性已被当前的编译器所支持。


这个标准是基于以前的参考手册制定的,语言本身只做了相对较少的改动。这个标准的目的之一就是确保现有的程序仍然有效,或者当程序无效时,编译器会对新的定义发出警告信息。


对大部分程序员来说,最重要的变化是函数声明和函数定义的新语法。现在,函数声明中可以包含描述函数实际参数的信息;相应地,定义的语法也做了改变。这些附加的信息使编译器很容易检测到因参数不匹配而导致的错误。根据我们的经验,这个扩充对语言非常有用。


新标准还对语言做了一些细微的改进:将广泛使用的结构赋值和杖举定义为语言的正式组成部分;可以进行单精度的浮点运算;明确定义了算术运算的属性,特别是无符号类型的运算;对预处理器进行了更详尽的说明。这些改进对大多数程序员的影响比较小。


该标准的第二个重要贡献是为 C 语言定义了一个函数库。它描述了诸如访问操作系统(如读写主件)、格式化输入/输出、内存分配和字符串操作等类似的很多函数。该标准还定义了一系列的标准 头主件,它们为访问函数声明和数据类型声明提供了统一的方法。这就确保了使用这个函数库与宿主系统进行交互时程序之间具有兼容的行为。该函数库很大程度上 与 UNIX 系统的 “ 标准 I/O 库 ” 相似。这个函数库已在本书的第 1 版中进行了描述,很多系统中都使用了它,这一点对大部分程序员来说,不会感觉到有很大的变化。


由于大多数计算机本身就直接支持 C 语言提供的数据类型和控制结构,因此只需要一个很小的运行时库就可以实现自包含程序。由于程序只能够显式地调用标准库中的函数,因此在不需要的情况下就可 以避免对这些函数的调用。除了其中隐藏的一些操作系统细节外,大部分库函数可以用 C 语言编写,并可以移植。


尽管 C 语言能够运行在大部分的计算机上,但它同具体的机器结构无关。只要稍加用心就可以编写出可移植的程序,即可以不加修改地远行于多种硬件上。 ANSI 标准明确地提出了可移植性问题,并预设了一个常量的集合,借以描述运行程序的机器的特性。


C 语言不是一种强类型的语言,但随着它的发展,其类型检查机制已经得到了加强。尽管 C 语言的最初定义不赞成在指针和整型变量之间交换值,但并没有禁止,不过现在已经不允许这种做法了。 ANSI 标准要求对变量进行正确的声明和显式的强制类型转换,这在某些较完善的编译器中已经得到了实现。新的函数声明方式是另一个得到改进的地方:编译器将对大部 分的数据类型错误发出警告,并且不自动执行不兼容数据类型之间的类型转换。不过, C 语言保持了其初始的设计思想,即程序员了解他们在做什么,惟一的要求是程序员要明确地表达他们的意图。


同任何其它语言一样, C 语言也有不完美的地方。某些运算符的优先级是不正确的;语法的某些部分可以进一步优化。尽管如此,对于大量的程序设计应用来说, C 语言是一种公认的非常高效的、表示能力很强的语言。


本书是按照下列结构编排的:第 1 章将对 C 语言的核心部分进行简要介绍。其目的是让读者能尽快开始编写 C 语言程序,因为我们深信,实际编写程序才是学习一种新语言的好方法。这部分内客的介绍假定读者对程序设计的基本元素有一定的了解。我们在这部分内容中没有 解释计算机、编译等概念,也没有解释诸如 n = n + 2 这样的表达式。我们将尽量在合适的地方介绍一些实用的程序设计技术,但是,本书的中心目的并不是介绍教据结构和算法。在篇幅有限的情况下,我们将专注于讲 解语言本身。


第 2 章到第 6 章将更详细地讨论 C 语言的各种特性,所采用的方式将比第 l 章更加形式化一些。其中的重点将放在一些完整的程序例子上,而并不仅仅只是一些孤立的程序段。第 2 章介绍基本的数据类型、运算符和表达式。第 3 章介绍控制流,如 if-else 、 switch 、 while 和 for 等。第 4 章介绍函数和程序结构 —— 外部变量、作用域规则和多源文件等,同时还会讲述一些预处理器的知识。第 5 章介绍指针和地址运算。第 6 章介绍结构和联合。


第 7 章介绍标准库。标准库提供了一个与操作系统交互的公用接口。这个函数库是由 ANSI 标准定义的,这就意味着所有支持 C 语言的机器都会支持它,因此,使用这个库执行输入/输出或其它访问操作系统的操作的程序可以不加修改地运行在不同机器上。
C语言