第1章
C语言概述
Chapter1
学习目标

.掌握C程序的发展史与特点。
.掌握C语言的基本语法。
.掌握设计简单C程序的方法。
.掌握C程序的开发过程。
1.初识C语言
1 

语言是人与人之间交流的工具。程序设计语言是人与计算机交流的工具,C语言是
其中的一种。程序是使用程序设计语言编写出的一些语句序列,是人和计算机交流的
方式。

1.1.1 C 
语言的发展史
第1阶段:A语言

C语言的发展颇为有趣,真要寻根探源,它的原型还是ALGOL60 语言,也称A 

语言。

1960 年国际计算机委员会设计了一种面向问题的结构化程序设计语言ALGOL60 
语言,但它不能直接对硬件进行操作,所以不宜用来编写系统程序。

第2阶段:CPL 语言

1963 年,英国剑桥大学在ALGOL60 基础上推出CPL(combinedprogramminglanguage)语言,该语言比较接近于硬件,但规模比较大,难以实用。

第3阶段:BCPL 语言

1967 年,英国剑桥大学的马丁·理查德(MartinRichards)对CPL 语言进行了简化, 
推出了BCPL(basiccombinedprogramminglanguage)语言。

第4阶段:B语言

1970 年,美国贝尔实验室的肯尼思·汤普森(KennethLaneThompson)以BCPL 语
言为基础,又做了进一步简化,设计出了很简单且接近硬件的B语言(取BCPL 的第一个
字母), 并用B语言编写了第一个UNIX 操作系统,在DEC 公司的PDP-7小型机上运行。


2
此时的B语言过于简单,而且功能有限。

第5阶段:C语言

1972 年,美国贝尔实验室的丹尼斯·麦卡利斯泰尔·里奇(DennisMacAlistair 
Ritchie)在B语言的基础上设计出了C语言(取BCPL 的第二个字母)。C语言既保持了
BCPL 和B语言的优点(接近硬件), 又克服了它们的缺点(过于简单、数据无类型等)。

1973 年肯尼思·汤普森和丹尼斯·麦卡利斯泰尔·里奇合作将90% 以上的UNIX 
操作系统用C语言进行改写(即UNIX 第5版)。UNIX 操作系统由于使用了C语言而
取得成功,几乎成为16 位微机的标准操作系统。C语言从诞生开始就由于编制UNIX 操
作系统的成功而引起了人们的关注。

1973 年之后,C语言的发展相当迅速。1975 年UNIX 第6版公布,1977 年又研制成
功不依赖具体机器的C语言编译文本《可移植C语言编译程序》,推动了C语言在各种机
型上的广泛应用。

1978 年,UNIX 第7版研制成功。以其中的C编译系统为基础,丹尼斯·麦卡利斯
泰尔·里奇被称作C语言之父(UNIX 之父)和布赖恩·威尔森·克尼汉(BrianWilson 
Kernighan)合著了影响深远的名著TheCProgrammingLanguage,被称为标准C。

1983 年,美国国家标准化协会(ANSI)根据C语言问世以来各种版本对C语言的发

展和扩充,制定了新的标准草案,即83ANSIC 。
1987 年,ANSI 又公布了新标准,即87ANSIC 。
1591989(1989 年,ANSI 又公布了新的标准,即ANSIX3.—简称C89 )。
1990 年,国际标准化组织(接受C89, 称为

ISO) 作为国际标准ISO/IEC9899:1990, 
标准C,简称C90 。ISO 的C90 和ANSI 的C89 基本上是相同。
1995 年,称为C95 。

ISO 对C90 做了一些修订, 

1999 年C语言标准又得到改进,这就是ISO/IEC9899:1999,俗称C99,该标准
于2000 年3月被ANSI 采用。但目前各软件厂商提供的C语言编译系统都未实现
C99 建议的功能,例如Microsoft(微软)和Borland公司,大多数是以C89 为基础进行
开发的。但厂商提供的不同版本的C编译系统所实现的语言功能和语法规则又略
有差别。因此读者应了解所用的C语言编译系统的特点。本书的叙述基本上以C89 
为基础。

目前,在计算机上广泛使用的C语言编译系统有TurboC 、BorlandC++Builder、
MicrosoftVisualC+crosoftVisualC++.

发环境是VC++6.
+(简称VC++)以及MiNET 等。本书使用的开

0系统。

计算机编程语言总的来说可以分为机器语言、汇编语言和高级语言三大类。C语言
是目前国际上广泛流行的计算机高级语言,既可用于编写系统软件,也可用于编写应用软
件,集汇编语言和高级语言的优点于一身。因此熟练掌握C语言是计算机开发人员的一
项基本功。

1.1.2 C 
语言的特点
每一种语言都有自己的特点,C语言也不例外,所以才有了语言的更替,有了不同语


3 

言的使用范围。C语言主要有以下特点。

1. 简洁紧凑、灵活方便
C语言一共只有32 个关键字,9种控制语句,程序书写自由,主要用小写字母表示。
它把高级语言的基本结构和语句与低级语言的实用性结合起来。

2. 运算符丰富
C语言的运算符包含的范围广泛,共有44 种运算符。C语言把括号、赋值、强制类型
转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。灵
活使用各种运算符,可以实现在其他高级语言中难以实现的运算。

3. 数据类型丰富
C语言的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类
型等,能用来实现各种复杂的数据结构的运算。C语言引入了指针概念,使程序效率更
高。另外,C语言具有强大的图形功能,支持多种显示器和驱动器,且计算功能、逻辑判断
功能强大。

4.C语言是结构化和模块化的语言
C语言具有结构化的控制语句,控制程序流向,是一种结构化程序设计语言。这种结
构化方式可使程序层次清晰,便于使用、维护和调试。C语言是以函数形式提供给用户
的,用函数作为程序的模块单位,这些函数可方便地调用,便于实现程序的模块化。

5.C语言语法限制不太严格,程序设计自由度大
一般的高级语言语法检查比较严格,能够检查出几乎所有的语法错误。而C语言允
许程序编写者有较大的自由度。C语言程序生成代码质量高,程序执行效率高。

6.C语言可以进行底层开发
C语言允许直接访问物理地址,可以直接对硬件进行操作,C语言可以像汇编语言一
样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来编写系统
软件。

7.C语言适用范围大,可移植性好
C语言适用于多种操作系统,如DOS 、UNIX 、Windows等,也适用于多种机型。

综上所述,C语言是一种功能很强的语言。但是,它也有一些不足之处:C语言语法
限制不严格,虽然可使熟练的程序员编程更灵活,但安全性低;运算符丰富,完成功能强, 
但难记、难掌握。因此,学习、使用C语言不妨先学基础部分,先用起来,用熟练后再学习
语法规则,进而全面掌握C语言。


4 
1.1.3 第一个C 程序
下面通过一个例题来认识C程序。
【例1-1】 在计算机屏幕上输出一行字符。 
1 #include <stdio.h> 
2 void main() /*函数定义,函数名称为main(),称作主函数*/ 
3 { 
4 printf("This is a C program.\n"); 
5 } 
说明: 
(1)程序第1行代码的作用是进行相关的预处理操作。其中字符#是预处理标志, 
用来对文本进行预处理操作,include是预处理命令,它后面跟一对尖括号,表示头文件在
尖括号内读入,stdio.h就是标准输入/输出头文件,因为程序要使用输入/输出函数,所以
一般C程序的开头都要写上这样一行命令。放在源程序的最前面,用来提供输入/输出
函数的声明。
(2)程序第2行代码声明了一个main()函数,该函数是程序的入口。main()是函数
名字,表示“主函数”;main()前面的void表示此函数是“空类型”,void是“空”的意思,即
执行此函数后不产生一个函数值。每一个C程序都必须有一个main()函数,程序总是从
main()函数开始执行。程序中以/*开头到*/结尾中的所有内容表示注释。在编译时
注释行被忽略,并不产生代码行。
(3)程序第3行,函数体由花括号“{”表示开始。
(4)程序第4行代码调用了一个用于格式化输出的printf()函数,在程序中printf() 
函数的作用是把括号内双引号之间的字符串按原样输出。\n是换行符,即在输出Thisis 
aCprogram.后回车换行。这行程序末尾的分号,则是C语句结束的标志。
(5)程序第5行,函数体由花括号}括起来,表示程序结束。
运行结果为 
This is a C program. 
1.2 C 语言的语法基础
1.2.1 C 语言字符集 
C语言的基本符号可分为4类,归纳如下。
(1)英文字母:大小写各26个,共计52个。
(2)阿拉伯数字:0、1、2、3、4、5、6、7、8、9,共10个数字。
(3)下画线:_。
(4)特殊符号:通常由1或2个符号组成,主要用来表示运算符。下面列举几种常用

5 
运算符。
. 算术运算符:+、-、*、/、%、++、--。
. 关系运算符:<、>、>=、<=、==、!=。
. 逻辑运算符:&&、||、!。
. 位运算符:&、|、~、^、>>、<<。
. 条件运算符:?:。
. 赋值运算符:=。
. 其他分隔符:()、[]、{}、.、,、;。
1.2.2 标识符
1.标识符的概念 
标识符就是用来标识变量名、符号常量名、函数名、数组名、数据类型名、宏以及文件
名等的有效字符序列。简单地说,标识符就是一个名字。
2.定义规则
(1)标识符只能由字母、数字和下画线3种字符组成,且第一个字符必须为字母或下
画线。变量名、函数名等用小写字母标识,而符号常量全用大写字母表示,函数名和外部
变量名由小于6个字符的字符串组成,系统变量由下画线起头构成。
(2)在C语言中,大小写字母不等效。因此,a和A、I和i、Sum 和sum 分别是两个
不同的标识符。
(3)用户自定义的标识符不能与C语言的保留字(关键字)同名,也不能与C语言库
函数同名。
(4)标识符应当直观且可以拼读,让读者看了就能了解其用途。标识符最好采用英
文单词或其组合,不要太复杂,且用词要准确,便于记忆和阅读。切忌使用汉语拼音来
命名。
(5)在C语言中,标识符的长度可以是一个或多个字符,但是只有前面32个字符有
效,即系统能识别的标识符最大长度为32。
有的系统取8个字符,假如程序中出现的变量名长度大于8个字符,则只有前面8个
字符有效,后面的不被识别。例如,下面的3个变量名将被当作同一个标识符处理: 
student_name、student_number、student_sex。因此,为了程序的可移植性及阅读程序的
方便,建议标识符的长度不要超过8个字符。
(6)尽量避免名字中出现数字编号,如value1、value2等,除非逻辑上需要编号。例
如,下面为合法的标识符:year、month、student_name、sum2_3、PRICE;下面为不合法的
标识符:M.D.Jones、#a、$432、3b、?c、a=b。
1.2.3 保留字
保留字又称为关键字,就是具有特定含义的标识符,用户不能用作自定义标识符。C语

6 
言提供的标准保留字有32个,非标准保留字有27个,另外还有特定字。
1.标准保留字
(1)与数据类型有关的标准保留字有14 个,包括char、int、float、double、signed、
unsigned、short、long、void、struct、union、typedef、enum、sizeof。
(2)与存储类别有关的标准保留字有4个,包括auto、extern、register、static。
(3)与程序控制结构有关的标准保留字有12个,包括do、while、for、if、else、switch、
case、default、goto、continue、break、return。
(4)其他的标准保留字有2个,包括const、volatile。
2.非标准保留字
非标准保留字有27个,包括asm、-AX、-AH、-AL、cdecl、-BX、-BH、-BL、near、-CX、
-CH、-CL、far、-DX、-DH、-DL、huge、-BP、-SP、-DI、interrupt、-SI、-cs、-ds、pascal、-es、-ss。
3.特定字
特定字有7个,包括#include、#define、#ifdef、#ifndef、#undef、#endif、#elif。
特定字用在预处理语句中,虽不是保留字,但人们习惯将它们看成保留字,并赋予了
特定的含义。
1.3 设计简单的C程序
一个完整的计算机程序通常具备三个功能,即输入数据、数据运算和输出结果。在C 
语言中,数据运算主要是由赋值语句完成的,而C语言本身不提供输入/输出语句,在C 
语言中,数据的输入与输出则需要调用C编译系统提供的scanf()函数与printf()函数来
实现。在系统学习C 语言程序设计之前,本节先简要介绍赋值语句、scanf()函数和
printf()函数的使用,以便能进行简单的程序设计,方便以后各章内容的叙述。
1.3.1 赋值语句
1.赋值运算符 
赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。
例如: 
a=5,其作用是执行一次赋值操作(或称赋值运算),将常量5赋给变量a。
x=a/b,将表达式a/b的值赋给变量x。
2.赋值表达式
由赋值运算符连接起来的式子叫作赋值表达式。其一般形式是: 
左值表达式=右值表达式

7 
左值表达式必须是变量,右边可以是表达式,赋值表达式的操作是先计算赋值号“=” 
右边表达式的值,再赋给左边的变量,即将数值存入变量的存储单元中。
例如: 
a=b=c=10 等价于a=(b=(c=10)) 
即先将常量10赋给变量c,然后再将10赋给变量b,最后将10赋给变量a。
3.赋值语句的格式
赋值表达式后加上“;”就构成了赋值语句。
赋值语句的格式是: 
左值表达式=右值表达式; 
例如: 
x=10; 
x=2*y+3; 
都是合法语句。 
3=x-2*y; 
是不合法语句。因为3是常数,不是变量。
C语言允许在同一个语句中进行反复赋值。
例如: 
a=b=c=1; 
其操作是将1赋值给变量c,将变量c的值1赋值给变量b,再将变量b的值1赋值
给变量a。其作用等同于“a=1;b=1;c=1;”。这在有些语言中是不允许的。
1.3.2 printf()函数
1.printf()函数的调用格式 
printf()函数的调用格式是: 
printf(格式控制,输出表列); 
printf()函数的主要功能是按“格式控制”所指定的格式,从标准输出设备上输出“输
出表列”中列出的各输出项。在printf()函数结尾加上“;”就构成了格式输出语句。
2.printf()函数的格式说明
(1)“格式控制”是由双引号括起来的字符串,包括格式说明和普通字符。格式说明
由%和其后的格式字符组成,用来指定输出数据的输出格式。不同类型的数据需要不同
的格式说明符。表1-1列出了printf()函数常用格式字符。

8 
表1-1 printf()函数常用格式字符
格式字符输出类型说 明
d 整型数据以带符号的十进制形式输出整数(正数符号不输出) 
o 整型数据以八进制无符号形式输出整数(不输出前导符0) 
x 整型数据以十六进制无符号形式输出整数(不输出前导符0x或0X) 
u 整型数据以带符号的十进制形式输出整数
c 字符型数据以字符形式输出,只输出一个字符
s 字符型数据以字符串形式输出
f 实型数据以小数形式输出单、双精度数,隐含输出6位小数
e 实型数据以标准指数形式输出单、双精度数,数字部分小数位数为6位 
(2)“输出表列”由若干个变量或表达式组成,之间用逗号“,”隔开。
例如: 
printf("a=%d,b=%d",a,b); 
【例1-2】 printf()函数的使用。 
1 #include <stdio.h> 
2 void main() 
3 { 
4 int a,b,c,d; 
5 a=10; 
6 b=20; 
7 c=50; 
8 d=25; 
9 printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); 
10 printf("a+b=%d,a-b=%d\n",a+b,a-b); 
11 printf("a*b=%d,c/d=%d\n",a*b,c/d); 
12 } 
说明: 
(1)程序第4行是声明部分,定义a、b、c和d四个整型变量。
(2)程序第5~8行是赋值语句,分别将常量10、20、50和25赋给变量a、b、c和d。
(3)程序第9~11行是格式输出语句。
运行结果为 
a=10,b=20,c=50,d=25 
a+b=30,a-b=-10 
a*b=200,c/d=2

9 
1.3.3 scanf()函数
1.scanf()函数的调用格式 
scanf()函数的调用格式是: 
scanf(格式控制,地址表列); 
scanf()函数的主要功能是按所指定的格式从标准输入设备读入数据,并将数据存入
地址表列所指定的存储单元中。在scanf()函数结尾加上“;”就构成了格式输入语句。
2.scanf()函数的格式说明
(1)“格式控制”是由双引号括起来的字符串,仅包括格式说明部分,格式说明由“%” 
和类型说明符组成,用于指定输入数据的类型。scanf()函数用到的格式字符如表1-2 
所示。
表1-2 scanf()函数格式字符
格式字符输入类型说 明
d 整型数据输入十进制整数
o 整型数据输入八进制整数
x 整型数据输入十六进制整数
u 整型数据输入无符号十进制整数
c 字符型数据输入单个字符
s 字符型数据输入字符串
f 实型数据输入实数,可用小数形式或指数形式输入
e 实型数据与f作用相同 
(2)“地址表列”是由若干个变量的地址组成,就是在变量名前加“&”,当变量地址有
多个时,各变量地址之间用逗号“,”隔开。“地址表列”中的地址个数必须与格式参数的个
数相同,并且依次匹配。例如: 
scanf("%d%d%d",&a,&b,&c) 
当从键盘输入数据时,输入的数值数据之间用间隔符(空格符、制表符或回车符)隔
开,间隔符数量不限。最后一定要按Enter键,scanf()函数才能接收从键盘输入的数据。
1.3.4 库函数和头文件
前面介绍的printf()函数和scanf()函数是C编译系统提供的库函数。库函数不是C 
语言的组成部分,而是由C编译系统提供的一些非常有用的功能函数,例如,各种输入/ 
输出函数、数学函数、字符串处理函数等,可供用户在自己程序中直接调用。这些库函数

1 0 
的说明、类型和宏定义都分门别类地保存在相应的“头文件”(也称包含文件或标题文件) 
中。在C语言的编译系统中,提供了若干个“头文件”。“头文件”以.h为扩展名,且为文
本文件。当使用系统提供的库函数时,只需在程序开始加上预处理语句:#include<头
文件> 或者#include"头文件"。这条语句指明用#include命令将“头文件”中的内容包
含到用户源程序中,使之成为源程序的一部分。
printf()函数和scanf()函数是在头文件stdio.h中定义的,stdio是standardinput& 
output的缩写,h是head的缩写,因此,在调用它们之前,只要在程序开始加上预处理语
句#include<stdio.h>或者#include"stdio.h",然后就可以在程序中使用scanf()函数
和printf()函数实现输入/输出功能。
C语言有丰富的库函数,应该尽量利用。
【例1-3】 计算任意立方体的表面积和体积。
设一个立方体的三条边分别是a、b、c,表面积为s,体积为v,程序代码如下: 
1 #include <stdio.h> 
2 void main() 
3 { 
4 int a,b,c,s,v; /*定义三条边为a、b 和c,表面积为s,体积为v*/ 
5 scanf("%d%d%d",&a,&b,&c); /*输入三条边的长度*/ 
6 s=2*(a*b+b*c+a*c); /*计算表面积*/ 
7 v=a*b*c; /*计算体积*/ 
8 printf("s=%d\n",s); /*输出表面积*/ 
9 printf("v=%d\n",v); /*输出体积*/ 
10 } 
说明: 
(1)程序第4行代码是声明部分,定义三条边为a、b和c,表面积为s,体积为v,均为
整型变量。
(2)程序第5行代码,当运行到“scanf("%d%d%d",&a,&b,&c);”时,系统停下等
待用户将整型数据从键盘输入给变量a、b、c。其中,&a、&b、&c中的& 是地址运算符, 
&a的含义是变量a在内存中的地址。scanf()函数按照a、b、c在内存中的地址&a、&b、
&c给a、b、c赋值。
scanf()函数中的“%d%d%d”表示按十进制整数形式输入数据。从键盘输入时,两
个数据之间用一个或多个空格间隔,也可用Enter键、Tab键间隔。不能用逗号间隔两个
数据。
(3)程序第6行是赋值语句,将表面积的值赋值给变量s。
(4)程序第7行是赋值语句,将体积的值赋值给变量v。
(5)程序第8行是格式输出语句,printf()函数括号中双引号括起来的“s=”按原样
输出,%d表示“以十进制整数类型”输出变量s的值,printf()函数括号内逗号右边s是要
输出的变量。
(6)程序第9行是格式输出语句,输出变量v的值。