
1.1 C语言概述
1.1.1 什么是C语言

在回答什么是C语言之前,我们先要了解一下什么是计算机编程语言。人们日常交流中,语言有很多种,包括汉语、英语、法语、韩语等,虽然他们的词汇和格式都不一样,但是可以达到相同的目的。我们通过有固定格式和固定词汇的“语言”来与他人交流,让他人为我们做事情。同样,我们也可以通过“语言”来与计算机交流,让计算机为我们做事情,这样的语言叫做编程语言(Programming Language)。
编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样),必须遵守,否则就会出错,达不到工作的目的。
计算机编程语言的种类非常多,总的来说可以分成机器语言、汇编语言和高级语言三大类。
机器语言:机器语言是指一台计算机全部的指令集合。电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机语言的基础。计算机发明之初,人们写出一串串由“0”和“1”组成的指令序列,交由计算机执行,这种计算机能够识别的语言,就是机器语言,即第一代计算机语言。
汇编语言:为了减轻使用机器语言编程的痛苦,人们做出了一种有益的改进,即用一些简洁的英文字母、符号串来替代一个特定指令的二进制串。比如,用“ADD”代表加法,“MOV”代表数据传递等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得简便、快捷,这种程序设计语言就称为汇编语言,即第二代计算机语言。
高级语言:计算机语言具有高级语言和低级语言之分。而高级语言又主要是相对于机器语言和汇编语言而言的,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。编写的程序称之为源程序。
高级语言并不是特指的某一种具体的语言,而是包括很多编程语言,如流行的Java、C、C++、C#、Python等,这些语言的语法、命令格式都不相同。

1969~1973年,美国电话电报公司(AT &T)贝尔实验室开始C语言的最初研发,并于1978年正式发表。1983年,美国国家标准协会(American National Standards Institute,ANSI)在此基础上制定了一个C语言标准,称之为ANSI C。
根据C语言的发明者丹尼斯·里奇(Dennis Ritchie,见图1.1)说,C语言最重要的研发时期是在1972年。C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。

图1.1 C语言之父——丹尼斯·里奇(Dennis Ritchie)
C语言的诞生是和UNIX操作系统的开发密不可分的,原先的UNIX操作系统都是用汇编语言写的。1973年,UNIX操作系统的核心用C语言改写,从此以后,C语言成为编写操作系统的主要语言。在ANSI C标准确立之后,C语言的规范在很长一段时间内都没有大的变动。1995年,WG14小组对C语言进行了一些修改,这个版本成为后来1999年发布的ISO/IEC 9899:1999标准,通常被称为C99。
C语言是一种结构化语言,它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高、可移植性强等特点,因此广泛地移植到了各类型计算机上,从而形成了多种版本的C语言。
1.1.2 为什么学习C语言
C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的关系,这些底层知识决定了你的发展高度,也决定了你的职业生涯。如果你希望成为出类拔萃的人才,而不仅仅是“码农”,这些知识就是不可逾越的。也只有学习C语言,才能更好地了解它们。有了足够的基础,以后学习其他语言,就会触类旁通。

C语言对现代编程语言有着巨大的影响,毫不夸张地说:C语言是现代编程语言的开山鼻祖,它改变了编程世界,许多现代编程语言都借鉴了大量C语言的特性。在众多基于C的语言中,以下几种非常具有代表性。
C++:包括了所有C的特性,但增加了类和其他特性以支持面向对象编程。
Java:是基于C++基础上开发的,所以也继承了许多C的特性。
C#:是由C++和Java发展起来的一种高级语言。
Perl:最初是一种简单的脚本语言,在发展过程中采用了C的许多特性。
这么多新的计算机语言,我们为什么还要学习C语言呢?第一,学习C语言有助于更好地理解C++、Java、C#及其他基于C的语言特性,一开始就学习其他语言的程序员往往不能很好地掌握继承自C语言的基本特性;第二,目前仍有许多C程序,我们需要读懂并维护这些代码,况且有大量的现成代码可以利用,这就可以在过去程序的基础上,快速和高效地编写新的算法和函数;第三,C语言仍然广泛应用于新软件开发,特别是在内存和处理能力受限的情况下以及需要使用C语言简单特性的地方;第四,C语言在各种考试和算法描述上仍被广泛使用,如C语言版的《数据结构》。
我们之所以选择C语言作为计算机编程语言的入门语言,除了上述原因外,C语言本身的特点也非常适合初学者。
1.语言简洁、紧凑,使用方便
C语言一共只有32个关键字、9种控制语句,程序书写形式自由,区分大小写。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2.运算符丰富
C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型更丰富,表达式类型更多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。
3.数据类型丰富
C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂数据结构的运算,并引入了指针概念,使程序效率更高。
4.表达方式灵活
C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。它的语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。
5.允许直接访问物理地址,对硬件进行操作
由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。
6.生成目标代码质量高,程序执行效率高
C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。
7.可移植性好
C语言在不同机器上的C编译程序,86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。
8.表达力强
C语言有丰富的数据结构和运算符,包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言具有强大的图形功能,支持多种显示器和驱动器,且计算功能、逻辑判断功能强大。