C 程序设计
(第二版 )
新世纪计算机基础教育丛书丛书 主编 谭浩强总 目 录第 1章 C语言概述第 2章 程序的灵魂 —— 算法第 3章 数据类型、运算符与表达式第 4章 最简单的 C程序设计 —— 顺序程序设计第 5章 选择结构程序设计第 6章 循环控制第 7章 数组第 8章 函数第 9章 预处理命令第 10章 指针第 11章 结构体与共用体第 12章 位运算第 13章 文件第 14章 C++对 C的扩充第 15章 C++的面向对象基础第 16章 常见错误和程序调试第 1章 C语言概述
1.1 C语言出现的历史背景
1.2 C语言的特点
1.3 简单的 C程序介绍
1.4 C程序的上机步骤
1.5 习题
1.1 C语言出现的历史背景
C语言是国际上广泛流行的计算机高级语言,既可用来写系统软件,也可用来写应用软件。
C语言是在 B语言的基础上发展起来的,它的根源可以追溯到 ALGOL 60。 1960年出现的 ALGOL 60是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统程序。 1963年英国的剑桥大学推出了 CPL (combined programming language)语言。
CPL语言在 ALGOL 60的基础上接近硬件一些,
但规模比较大,难以实现。 1967年英国剑桥大学的 Matin Richards对 CPL语言做了简化,推出了
BCPL (basic combined programming language) 语言。 1970年美国贝尔实验室的
Ken Thompson 以 BCPL语言为基础,又做了进一步简化,设计出了很简单的而且很接近硬件的
B语言 (取 BCPL的第一个字母 ),并用 B语言写了第一个 UNIX操作系统,在 PDP 7上实现。 1971
年在 PDP 11/20上实现了 B语言,并写了 UNIX
操作系统。但 B语言过于简单,功能有限。
1972年至 1973年间,贝尔实验室的 D.M.Ritchie 在 B
语言的基础上设计出了 C语言 (取 BCPL的第二个字母 )。 C语言既保持了 BCPL和 B语言的优点 (精练,接近硬件 ),又克服了它们的缺点 (过于简单,
数据无类型等 )。最初的 C语言只是为描述和实现
UNIX操作系统提供一种工作语言而设计的。
1973年,K.Thompson和 D.M.Ritchie两人合作把
UNIX的 90%以上用 C改写,即 UNIX第 5版。原来的 UNIX 操作系统是 1969年由美国的贝尔实验室的 K.Thompson和 D.M.Ritchie开发成功的,是用汇编语言写的。
1972年至 1973年间,贝尔实验室的 D.M.Ritchie 在 B语言的基础上设计出了 C语言 (取 BCPL的第二个字母 )。
C语言既保持了 BCPL和 B语言的优点 (精练,接近硬件 ),又克服了它们的缺点 (过于简单,数据无类型等 )。最初的 C语言只是为描述和实现 UNIX操作系统提供一种工作语言而设计的。 1973年,
K.Thompson和 D.M.Ritchie两人合作把 UNIX的 90%
以上用 C改写,即 UNIX第 5版。原来的 UNIX 操作系统是 1969年由美国的贝尔实验室的 K.Thompson和
D.M.Ritchie开发成功的,是用汇编语言写的。
后来,C语言多次做了改进,但主要还是在贝尔实验室内部使用。直到 1975年 UNIX第 6版公布后,
C语言的突出优点才引起人们的普遍注意。 1977
年出现了不依赖于具体机器的 C语言编译文本
,可移植 C语言编译程序,,使 C移植到其他机器时所需做的工作大大简化了,这也推动了 UNIX
操作系统迅速地在各种机器上实现。例如 VAX、
AT&T等计算机系统都相继开发了 UNIX。随着
UNIX的日益广泛使用,C语言也迅速得到推广。
C语言和 UNIX可以说是一对孪生兄弟,在发展过程中相辅相成。 1978年以后,C语言已先后移植到大、中、小、微型机上,已独立于 UNIX和 PDP
了。现在 C语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一。以 1978年发表的 UNIX第 7版中的 C编译程序为基础,Brian
W.Kernighan和 Dennis M.Ritchie (合称 K&R)合著了影响深远的名著,The C Programming
Language》,这本书中介绍的 C语言成为后来广泛使用的 C语言版本的基础,它被称为标准 C。
1983年,美国国家标准化协会 (ANSI)根据 C语言问世以来各种版本对 C的发展和扩充,制定了新的标准,称为 ANSI C。 ANSI C比原来的标准 C
有了很大的发展。 K & R在 1988年修改了他们的经典著作,The C Programming Language》,
按照 ANSI C 标准重新写了该书。 1987年,ANSI
又公布了新标准 —— 87 ANSIC。
1990年,国际标准化组织 ISO(International
Standard Organization) 接受 87 ANSI C为 ISO C
的标准 (ISO 9899— 1990)。目前流行的 C编译系统都是以它为基础的。本书的叙述基本上以 ANSI C
为基础。目前广泛流行的各种版本 C语言编译系统虽然基本部分是相同的,但也有一些不同。在微型机上使用的有 Microsoft C,Turbo C、
Quick C,BORLAND C等,它们的不同版本又略有差异。因此,读者应了解所用的计算机系统所配置的 C编译系统的特点和规定 (可以参阅有关手册 )。
1.2 C语言的特点一种语言之所以能存在和发展,并具有生命力,总是有其不同于 (或优于 )其他语言的特点。 C语言的主要特点如下。
(1) 语言简洁、紧凑,使用方便、灵活。 C语言一共只有 32个关键字,9种控制语句,程序书写形式自由,主要用小写字母表示,压缩了一切不必要的成分。下面将 C与 PASCAL语言做一比较。
(2) 运算符丰富。 C的运算符包含的范围很广泛,共有 34种运算符。 C把括号、赋值、强制类型转换等都作为运算符处理,从而使 C的运算类型极其丰富,
表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。
(3) 数据结构丰富,具有现代化语言的各种数据结构。 C的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。
能用来实现各种复杂的数据结构 (如链表、树、
栈等 )的运算。尤其是指针类型数据,使用起来比 PASCAL更为灵活、多样。
(4) 具有结构化的控制语句 (如 if…else 语句,while
语句,do…while 语句,switch语句,for语句 )。
用函数作为程序的模块单位,便于实现程序的模块化。 C是良好的结构化语言,符合现代编程风格的要求。
(5) 语法限制不太严格,程序设计自由度大。例如对数组下标越界不做检查,由程序编写者自己保证程序的正确。对变量的类型使用比较灵活,例如整型数据与字符型数据可以通用。一般的高级语言语法检查比较严,能检查出几乎所有的语法错误。而 C语言允许程序编写者有较大的自由度,因此,放宽了语法检查。
程序员应当仔细检查程序,保证其正确,而不要过分依赖 C编译程序去查错。“限制”与“灵活”是一对矛盾。限制严格,就失去灵活性 ;而强调灵活,就必然放松限制。一个不熟练的编程人员,编一个正确的 C
程序可能会比编一个其他高级语言程序难一些。也就是说,对用 C语言的人,要求对程序设计更熟练一些。
(6) C语言能进行位 (bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此 C既具有高级语言的功能,又具有低级语言的许多功能,可用来写系统软件。 C语言的这种双重性,
使它既是成功的系统描述语言,又是通用的程序设计语言。
有人把 C称为“高级语言中的低级语言” 或“中级语言”,意为兼有高级和低级语言的特点。按此观点可将各语言分类如下:
高级,
BASIC,FORTRAN,COBOL,PASCAL,Ada,Modul
a-2;
中级,C,FORTH,宏汇编;
低级,汇编语言一般仍习惯将 C语言称为高级语言,因为 C程序也要通过编译、连接才能得到可执行的目标程序,这是和其他高级语言相同的。
C的以上特点,读者现在也许还不能深刻理解,待学完 C以后再回顾一下,就会有比较深的体会。
我们从应用的角度出发对 C语言和其他传统的高级语言作一简单比较。
从掌握语言的难易程度来看,C语言比其他语言难一些。 BASIC是初学者入门的较好的语言,
FORTRAN也比较好掌握。对科学计算多用
FORTRAN或 PL/Ⅰ ;对商业和管理等数据处理领域,用 COBOL为宜。 C语言虽然也可用于科学计算和管理领域,但并不理想,C的特长不在这里。对操作系统和系统实用程序以及需要对硬件进行操作的场合,用 C语言明显地优越于其他高级语言,有的大型应用软件也用 C语言编写。从教学角度,由于 PASCAL是世界上第一个结构化语言,而曾被认为是计算机专业的比较理想的教学语言。目前在数据结构等课程中一般用
PASCAL语言举例。但 PASCAL语言难以推广到各实际应用领域,
到目前为止基本上只是教学语言。 C语言也是理想的结构化语言,且描述能力强,同样适于教学。 操作系统课程多结合 UNIX讲解,而 UNIX
与 C不可分,因此,C语言已经成为被广泛使用的教学语言。 C除了能用于教学外,还有广泛的应用领域,因此更有生命力。 PASCAL和其他高级语言的设计目标是通过严格的语法定义和检查来保证程序的正确性,而 C则是强调灵活性,使程序设计人员能有较大的自由度,以适应宽广的应用面。总之,C语言对程序员要求较高。程序员使用 C语言编写程序会感到限制少,灵活性大,
功能强,可以编写出任何类型的程序。现在,C
语言已不仅用来编写系统软件,也用来编写应用软件。学习和使用 C的人已越来越多。
1.3 简单的 C程序介绍下面先介绍几个简单的 C程序,然后从中分析 C程序的特性。
例 1.1
main ( )
{
printf ("This is a C program.\n");
}
本程序的作用是输出以下一行信息,
This is a c program.
其中 main 表示“主函数”。每一个 C程序都必须有一个 main
函数。函数体由大括弧 {}括起来。本例中主函数内只有一个输出语句,printf是 C语言中的输出函数 (详见第 4章 )。双引号
(双括号)内的字符串原样输出。,\n”是换行符,即在输出
,This is a c program.”后回车换行。语句最后有一分号。
例 1.2
main ( )/*求两数之和 */
{
int a,b,sum; /*这是定义变量 */
a=123; b=456; /* 以下 3行为 C语句 */
sum=a+b;
printf ("sum is %d/n",sum);
}
本程序的作用是求两个整数 a和 b之和 sum。 /*……*/ 表示注释部分,为便于理解,我们用汉字表示注释,当然也可以用英语或汉字拼音作注释。注释只是给人看的,对编译和运行不起作用。注释可以加在程序中任何位置。第 2
行是声明部分,定义变量 a和 b,指定 a和 b为整型 (int)变量。第 3行是两个赋值语句,使 a和 b的值分别为 123和
456。第 4行使 sum的值为 a+b,第 5行中,%d”是输入输出的“格式字符串”,用来指定输入输出时的数据类型和格式 (详见第 4章 ),,%d”表示
“以十进制整数形式输出”。在执行输出时,此位置上代以一个十进制整数值。 printf函数中括弧内最右端 sum是要输出的变量,现在它的值为
579(即 123+456之值 )。因此输出一行信息为 sum
is 579
例 1.3
main ( )/* 主函数 */
{ int a,b,c; /*声明部分,定义变量 */
scanf ("%d,%d",&a,&b); /*输入变量 a
和 b的值 */
c=max (a,b);/*调用 max函数,将得到的值赋给 c*/
printf ("max=%d",c); /*输出 c的值 */
}
int max(int x,int y) /* 定义 max函数,函数值为整型,形式参数 x,y为整型 */
{int z; /* max函数中的声明部分,定义本函数中用到的变量 z为整型 */
if (x>y) z=x;
else z=y;
return (z); /*将 z的值返回,通过 max带回调用处 */
}
本程序包括两个函数,主函数 main和被调用的函数
max。 max函数的作用是将 x和 y中较大者的值赋给变量 z。 return语句将 z的值返回给主调函数
main。返回值是通过函数名 max带回到 main函数的调用处。 main函数中的 scanf是“输入函数”
的名字 (scanf和 printf都是 C系统提供的标准输入输出函数 )。程序中 scanf函数的作用是输入 a和 b
的值。 &a和 &b中的,&”的含义是“取地址”,
此 scanf函数的作用是将两个数值分别输入到变量
a和 b的地址所标志的单元中,也就是输入给变量
a和 b。这种形式是与其他语言不同的。它相当于
BASIC语言中的 INPUT a,b或 PASCAL语言中的 Read (a,b)。 &a和 &b前面的,%d,%d”的含义与前相同,
只是现在用于“输入”。它指定输入的两个数据按十进制整数形式输入。关于 scanf函数详见第 4
章。
main函数中第 4行为调用 max函数,在调用时将实际参数 a和 b的值分别传送给 max函数中的形式参数 x和 y。经过执行 max函数得到一个返回值 (即
max函数中变量 z的值 ),把这个值赋给变量 c。然后输出 c的值。 printf函数中双引号内的
,max=%d”,在输出时,其中,%d”将由 c的值取代之,,max =”原样输出。程序运行情况如下,
8,5 (输入 8和 5给 a和 b)
max=8 (输出 c的值 )
本例用到了函数调用、实际参数和形式参数等概念,
我们只做了很简单的解释。读者如对此不大理解,
可以先不予以深究,在学到以后有关章节时,问题自然迎刃而解。在此介绍此例子,无非是使读者对 C程序的组成和形式有一个初步的了解。
通过以上几个例子,可以看到,
(1) C程序是由函数构成的。一个 C源程序至少包含一个 main函数,也可以包含一个 main函数和若干个其他函数。因此,函数是 C程序的基本单位。
被调用的函数可以是系统提供的库函数 (例如
printf和 scanf函数 ),也可以是用户根据需要自己编制设计的函数 (例如,例 1.3中的 max函数 )。 C的函数相当于其他语言中的子程序,用函数来实现特定的功能。程序中的全部工作都是由各个函数分别完成的。编写 C程序就是编写一个个函数。 C的函数库十分丰富,ANSI C建议的标准库函数中包括 100多个函数,Turbo C和 MS C 4.0提供 300多个库函数。 C的这种特点使得容易实现程序的模块化。
(2) 一个函数由两部分组成,
① 函数的首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数 (形参 )名、参数类型。
例如,例 1.3中的 max函数的首部为
int max (int x,int y )
↓ ↓ ↓ ↓ ↓ ↓
函数类型 函数名 函数参数类型 函数参数名 函数参数类型 函数参数名一个函数名后面必须跟一对圆括弧,函数参数可以没有,如 main( )。
② 函数体,即函数首部下面的大括弧 {……} 内的部分。如果一个函数内有多个大括弧,则最外层的一对 { }为函数体的范围。
函数体一般包括,
· 声明部分:在这部分中定义所用到的变量,如例
1.3中 main函数中的,int a,b,c;”。 在第 8章中还将会看到,在声明部分中要对所调用的函数进行声明。
执行部分:由若干个语句组成。
当然,在某些情况下也可以没有声明部分 (例如,
例 1.1)。甚至可以既无声明部分,也无执行部分。
如,
dump ( )
{ }
它是一个空函数,什么也不干,但这是合法的。
(3) 一个 C程序总是从 main函数开始执行的,而不论 main函数在整个程序中的位置如何 (main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前,在另一些函数之后 )。
(4) C程序书写格式自由,一行内可以写几个语句,
一个语句可以分写在多行上。 C程序没有行号,
也不像 FORTRAN或 COBOL那样严格规定书写格式 (语句必须从某一列开始书写 )。
(5) 每个语句和数据定义的最后必须有一个分号。
分号是 C语句的必要组成部分。例如,
c=a+b;
分号不可少。即使是程序中最后一个语句也应包含分号 (这是和 PASCAL语言不同的 )。
(6) C语言本身没有输入输出语句。输入和输出的操作是由库函数 scanf和 printf等函数来完成的。
C对输入输出实行“函数化”。由于输入输出操作牵涉到具体的计算机设备,把输入输出操作放在函数中处理,就可以使 C语言本身的规模较小,
编译程序简单,很容易在各种机器上实现,程序具有可移植性。当然,不同的 C语言系统需要对函数库中的函数作不同的处理。不同的 C系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。因此不同的系统所提供的函数个数和功能是有所不同的。
(7) 可以用 /*……*/ 对 C程序中的任何部分作注释。
一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。
1.4 C程序的上机步骤我们已经看到了一些用 C语言编写的程序。为了使计算机能按照人们的意志进行工作,必须根据问题的要求,
编写出相应的程序。所谓程序,就是一组计算机能识别和执行的指令。每一条指令使计算机执行特定的操作。程序可以用高级语言(例如 QBASIC,
FORTRAN,PASCAL,C等)编写。用高级语言编写的程序称为“源程序”( source program)。从根本上说,计算机只能识别和执行由 0和 1组成的二进制的指令,而不能识别和执行用高级语言写的指令。为了使计算机能执行高级语言源程序,必须先用一种称为“编译程序”的软件,把源程序翻译成二进制形式的“目标程序”,然后将该目标程序与系统的函数库和其他目标程序连接起来,形成可执行的目标程序。
图 1.1
在编好一个 C源程序后,如何上机运行呢? 在纸上写好一个程序后,要经过以下几个步骤:上机输入与编辑源程序对源程序进行编译与库函数连接运行目标程序这样几个步骤。
以上过程如图 1.1所示。其中实线表示操作流程,
虚线表示文件的输入输出。例如,编辑后得到一个源程序文件 f.c,然后在进行编译时再将源程序文件 f.c输入,经过编译得到目标程序文件 f.obj,
再将目标程序文件 f.obj输入内存,与系统提供的库函数等连接,得到可执行的目标程序文件 f.exe,
最后把 f.exe调入内存并使之运行。
在了解了 C语言的初步知识后,读者最好上机运行一个 C程序,以建立对 C程序的初步认识。
下面分别就三种不同的环境下运行 C程序作一简单介绍。
1,用 Turbo C 运行 C程序的步骤
Turbo C是在微机上广泛使用的编译程序。它具有方便、直观、易用的界面和丰富的库函数。它向用户提供一个集成环境,把程序的编辑、编译、
连接和运行等操作全部集中在一个界面上进行,
使用十分方便。
为了能使用 Turbo C,必须先将 Turbo C编译程序装入磁盘的某一目录下,例如放在 C盘根目录下一级 TC子目录下。
图 1.2
(1) 调用 Turbo C程序。如果用户的当前目录是
Turbo C编译程序所在的子目录(例如 TC子目录),只需从键盘键入,tc” 命令即可,
C:\TC>tc
屏幕上出现 Turbo C集成环境,见图 1.2所示。从图
1.2可以看到在集成环境的上部,有一行“主菜单”,其中包括下面 8个菜单项,
File Edit Run Compile Project Option Debug
break/watch
用户可以通过以上菜单项来选择使用 Turbo C集成环境所提供的 Turbo C的各项主要功能。以上 8个菜单项分别代表:文件操作、编辑、运行、编译、
项目文件、选项、调试、中断 /观察等功能。
用键盘上的,←,和,→”键可以选择菜单条中所需要的菜单项,被选中的项以“反相”图 1.3形式显示
(例如主菜单中的各项原来以白底黑字显示,被选中时改为以黑底白字显示)。
此时若按回车键,就会出现一个下拉菜单。例如在选中,File”菜单并按回车键后,屏幕上,File”下面出现下拉菜单,见图 1.3所示。它是一个子菜单,提供多项选择。可以用,↓”
键选择所需要的项。例如选择,New”处,并按回车键,表示要建立一个新的 C源程序。
图 1.3
如果选择,Load”,并按回车键,表示要调入一个已有的源文件,此时屏幕上出现一个对话框 (见图 1.4)。要求你输入该文件的名字。用户可输入该文件名,例如,tc1.c,
如果已存在此文件,则系统会将此文件调入内存并显示在屏幕上。此时自动转为编辑 (Edit)状态。
如果原来不存在此文件名,则系统会建立一个以指定的名字命名的新文件。
图 1.4
(2) 编辑源文件。在编辑 (Edit) 状态下可以根据需要输入或修改源程序。
(3) 编译源程序。选择,Compile”菜单并在其下拉菜单中选择,Compile to OBJ”,则进行编译,
得到一个后缀为,obj的目标程序(为方便起见,
在一般书刊中,以上菜单的选择以
,Compile/Compile to OBJ”表示 )。然后再选菜单,Compile/Link EXE file”,进行连接操作,
可得到一个后缀为,exe的可执行文件。也可以将编译和连接合为一个步骤进行。选菜单
,Compile/Make EXE file” 或按,F9”键,即可一次完成编译和连接。在屏幕上会显示编译或连接时有无错误和有几个错误,见图 1.5所示。此时按任何一个键,图 1.5所显示的“编译信息框”
会图 1.5
消 失,屏幕上会恢复显示源程序,光标停留在出错之处。
在屏幕的下半部分显示出有错误的行和错误的原因。根据此信息修改源程序。修改完毕认为无错后,再按,F9”,
再次进行编译和连接,如此反复进行到不显示出错为止。
(4) 执行程序。按,F10”键,在窗口上部的主菜单中某一项处出现“反相”显示(黑色亮块)。
File Edit Run Compile Project Option Debug
Break/watch
用,→”键将亮块移到,Run”,按回车键,在其下拉菜单中选择,Run”项,或直接按 Ctrl + F9键,
系统就会执行已编译好的目标文件。此时,TC
集成环境窗口消失,屏幕上显示出程序运行时输出的结果。如果程序需要输入数据 (如例 1.3),则应在此时,从键盘输入所需数据,然后程序会接着执行,输出结果。
如果发现运行结果不对,要重新修改源程序,可以再按,F10”键,并用,←,使亮块移到,Edit”
处,
按回车键,即进入编辑状态,可以根据需要修改源程序,并重复上述 (2),(3),(4)步,直到得到正确结果为止。
(5) 可以用,Alt”和,X”键 (同时按此两键 ),脱离
Turbo C,回到 DOS命令状态。
此时,可以用 DOS命令显示源程序和运行程序,
C> TYPE tc1.c (列出源程序清单 )
C> tc1 (执行目标程序 tc1.exe)
如果想再修改源程序,可以重新执行步骤( 1),
并输入源程序文件名即可。
2,在 UNIX操作系统下运行 C程序的步骤
(1) 用编辑程序 (如 UNIX系统的文本行编辑程序 ed,
或屏幕编辑程序 vi)将源程序输入计算机,经修改认为无误后,存入文件系统。设用户将源文件定名为 f.c (C源程序的后缀一般定为,.c”)。
(2) 编译。调用 C编译程序 cc对源文件进行编译。可打入命令,
cc f.c
如果在编译过程中发现源程序有语法错误,则系统会输出“出错信息”,告诉用户第几行有什么样的错误。用户应重新调用编辑程序,修改后再进行编译。如此直到编译通过为止。编译时先生成一个汇编语言程序 (即将 C源程序翻译成为一个汇编语言程序 ),然后由编译程序再将汇编语言程序翻译成机器指令程序,即目标程序。目标程序的文件名与相应的源程序同名,但后缀为,.o” (表示它是目标文件),上述源文件 f.c经编译后得到目标程序 f.o。
(3) 连接。将目标程序和库函数或其他目标程序连接成可执行的目标程序。在 UNIX系统下,连接是由 cc自动完成的。最后得到可执行文件,文件名由系统自动确定为 a.out。
如果不想用系统定的文件名 a.out,也可以在编译时自己指定可执行文件名。例如想指定为 f.out,
可以在编译时打入以下命令,
cc -o f.out f.c
它的作用是将源程序 f.c编译成可执行程序,文件名为 f.out。
(4) 执行程序。只需输入可执行文件名即可。例如,
a.out (系统指定的文件名 )
或 f.out (用户指定的文件名 )
3,在 DOS下用 Microsoft C 6.0编译程序运行 C程序的步骤
Microsoft C是微软公司为 IBM系列微机开发的 C编译系统。 MS C 6.0版本提供了多个库函数。老版本的
MS C采用基于 DOS平台的命令行方式。 MS C 6.0增加了基于鼠标和窗口的“程序员工作台”
( programmer's work bench,缩写为 PWB),
它也是一个集成环境。 MS C也是人们常用的 C编译系统之一。目前,大多数使用 MS C的人习惯用命令行方式。因此我们在这里只简单地介绍命令行方式的用法。
(1) 编辑 C源程序。可以用任何全屏幕编辑系统输入和编辑源程序。假设已输入和编辑好的源文件名为 a1.c。
(2) 编译和连接。 MS C提供了一个功能很强的 CL
命令,可一次完成程序的编译和连接。 CL是
Compile和 Link的第一个字母。用法如下:
CL a1.c (对源程序 a1.c进行编译和连接 )
如果在编译和连接时出现“出错信息”,则需要重新编辑 (修改 )源程序。编译和连接完成后,产生一个可执行文件 a1.exe。
(3) 执行程序。只需输入可执行文件名,
a1
即可得到运行结果。以上步骤只需上机试一下,即可明白。
习题
1.1 请根据自己的认识,写出 C语言的主要特点。
1.2 C语言的主要用途是什么? 它和其他高级语言有什么异同?
1.3 写出一个 C程序的构成。
1.4 C语言以函数为程序的基本单位,有什么好处?
1.5 请参照本章例题,编写一个 C程序,输出以下信息,
******************************
Very good!
******************************
1.6 编写一个 C程序,输入 a,b,c 3个值,输出其中最大者。
1.7 上机运行本章 3个例题,熟悉所用系统的上机方法与步骤。
1.8 上机运行本章习题 1.5和 1.6。
(第二版 )
新世纪计算机基础教育丛书丛书 主编 谭浩强总 目 录第 1章 C语言概述第 2章 程序的灵魂 —— 算法第 3章 数据类型、运算符与表达式第 4章 最简单的 C程序设计 —— 顺序程序设计第 5章 选择结构程序设计第 6章 循环控制第 7章 数组第 8章 函数第 9章 预处理命令第 10章 指针第 11章 结构体与共用体第 12章 位运算第 13章 文件第 14章 C++对 C的扩充第 15章 C++的面向对象基础第 16章 常见错误和程序调试第 1章 C语言概述
1.1 C语言出现的历史背景
1.2 C语言的特点
1.3 简单的 C程序介绍
1.4 C程序的上机步骤
1.5 习题
1.1 C语言出现的历史背景
C语言是国际上广泛流行的计算机高级语言,既可用来写系统软件,也可用来写应用软件。
C语言是在 B语言的基础上发展起来的,它的根源可以追溯到 ALGOL 60。 1960年出现的 ALGOL 60是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统程序。 1963年英国的剑桥大学推出了 CPL (combined programming language)语言。
CPL语言在 ALGOL 60的基础上接近硬件一些,
但规模比较大,难以实现。 1967年英国剑桥大学的 Matin Richards对 CPL语言做了简化,推出了
BCPL (basic combined programming language) 语言。 1970年美国贝尔实验室的
Ken Thompson 以 BCPL语言为基础,又做了进一步简化,设计出了很简单的而且很接近硬件的
B语言 (取 BCPL的第一个字母 ),并用 B语言写了第一个 UNIX操作系统,在 PDP 7上实现。 1971
年在 PDP 11/20上实现了 B语言,并写了 UNIX
操作系统。但 B语言过于简单,功能有限。
1972年至 1973年间,贝尔实验室的 D.M.Ritchie 在 B
语言的基础上设计出了 C语言 (取 BCPL的第二个字母 )。 C语言既保持了 BCPL和 B语言的优点 (精练,接近硬件 ),又克服了它们的缺点 (过于简单,
数据无类型等 )。最初的 C语言只是为描述和实现
UNIX操作系统提供一种工作语言而设计的。
1973年,K.Thompson和 D.M.Ritchie两人合作把
UNIX的 90%以上用 C改写,即 UNIX第 5版。原来的 UNIX 操作系统是 1969年由美国的贝尔实验室的 K.Thompson和 D.M.Ritchie开发成功的,是用汇编语言写的。
1972年至 1973年间,贝尔实验室的 D.M.Ritchie 在 B语言的基础上设计出了 C语言 (取 BCPL的第二个字母 )。
C语言既保持了 BCPL和 B语言的优点 (精练,接近硬件 ),又克服了它们的缺点 (过于简单,数据无类型等 )。最初的 C语言只是为描述和实现 UNIX操作系统提供一种工作语言而设计的。 1973年,
K.Thompson和 D.M.Ritchie两人合作把 UNIX的 90%
以上用 C改写,即 UNIX第 5版。原来的 UNIX 操作系统是 1969年由美国的贝尔实验室的 K.Thompson和
D.M.Ritchie开发成功的,是用汇编语言写的。
后来,C语言多次做了改进,但主要还是在贝尔实验室内部使用。直到 1975年 UNIX第 6版公布后,
C语言的突出优点才引起人们的普遍注意。 1977
年出现了不依赖于具体机器的 C语言编译文本
,可移植 C语言编译程序,,使 C移植到其他机器时所需做的工作大大简化了,这也推动了 UNIX
操作系统迅速地在各种机器上实现。例如 VAX、
AT&T等计算机系统都相继开发了 UNIX。随着
UNIX的日益广泛使用,C语言也迅速得到推广。
C语言和 UNIX可以说是一对孪生兄弟,在发展过程中相辅相成。 1978年以后,C语言已先后移植到大、中、小、微型机上,已独立于 UNIX和 PDP
了。现在 C语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一。以 1978年发表的 UNIX第 7版中的 C编译程序为基础,Brian
W.Kernighan和 Dennis M.Ritchie (合称 K&R)合著了影响深远的名著,The C Programming
Language》,这本书中介绍的 C语言成为后来广泛使用的 C语言版本的基础,它被称为标准 C。
1983年,美国国家标准化协会 (ANSI)根据 C语言问世以来各种版本对 C的发展和扩充,制定了新的标准,称为 ANSI C。 ANSI C比原来的标准 C
有了很大的发展。 K & R在 1988年修改了他们的经典著作,The C Programming Language》,
按照 ANSI C 标准重新写了该书。 1987年,ANSI
又公布了新标准 —— 87 ANSIC。
1990年,国际标准化组织 ISO(International
Standard Organization) 接受 87 ANSI C为 ISO C
的标准 (ISO 9899— 1990)。目前流行的 C编译系统都是以它为基础的。本书的叙述基本上以 ANSI C
为基础。目前广泛流行的各种版本 C语言编译系统虽然基本部分是相同的,但也有一些不同。在微型机上使用的有 Microsoft C,Turbo C、
Quick C,BORLAND C等,它们的不同版本又略有差异。因此,读者应了解所用的计算机系统所配置的 C编译系统的特点和规定 (可以参阅有关手册 )。
1.2 C语言的特点一种语言之所以能存在和发展,并具有生命力,总是有其不同于 (或优于 )其他语言的特点。 C语言的主要特点如下。
(1) 语言简洁、紧凑,使用方便、灵活。 C语言一共只有 32个关键字,9种控制语句,程序书写形式自由,主要用小写字母表示,压缩了一切不必要的成分。下面将 C与 PASCAL语言做一比较。
(2) 运算符丰富。 C的运算符包含的范围很广泛,共有 34种运算符。 C把括号、赋值、强制类型转换等都作为运算符处理,从而使 C的运算类型极其丰富,
表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。
(3) 数据结构丰富,具有现代化语言的各种数据结构。 C的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。
能用来实现各种复杂的数据结构 (如链表、树、
栈等 )的运算。尤其是指针类型数据,使用起来比 PASCAL更为灵活、多样。
(4) 具有结构化的控制语句 (如 if…else 语句,while
语句,do…while 语句,switch语句,for语句 )。
用函数作为程序的模块单位,便于实现程序的模块化。 C是良好的结构化语言,符合现代编程风格的要求。
(5) 语法限制不太严格,程序设计自由度大。例如对数组下标越界不做检查,由程序编写者自己保证程序的正确。对变量的类型使用比较灵活,例如整型数据与字符型数据可以通用。一般的高级语言语法检查比较严,能检查出几乎所有的语法错误。而 C语言允许程序编写者有较大的自由度,因此,放宽了语法检查。
程序员应当仔细检查程序,保证其正确,而不要过分依赖 C编译程序去查错。“限制”与“灵活”是一对矛盾。限制严格,就失去灵活性 ;而强调灵活,就必然放松限制。一个不熟练的编程人员,编一个正确的 C
程序可能会比编一个其他高级语言程序难一些。也就是说,对用 C语言的人,要求对程序设计更熟练一些。
(6) C语言能进行位 (bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此 C既具有高级语言的功能,又具有低级语言的许多功能,可用来写系统软件。 C语言的这种双重性,
使它既是成功的系统描述语言,又是通用的程序设计语言。
有人把 C称为“高级语言中的低级语言” 或“中级语言”,意为兼有高级和低级语言的特点。按此观点可将各语言分类如下:
高级,
BASIC,FORTRAN,COBOL,PASCAL,Ada,Modul
a-2;
中级,C,FORTH,宏汇编;
低级,汇编语言一般仍习惯将 C语言称为高级语言,因为 C程序也要通过编译、连接才能得到可执行的目标程序,这是和其他高级语言相同的。
C的以上特点,读者现在也许还不能深刻理解,待学完 C以后再回顾一下,就会有比较深的体会。
我们从应用的角度出发对 C语言和其他传统的高级语言作一简单比较。
从掌握语言的难易程度来看,C语言比其他语言难一些。 BASIC是初学者入门的较好的语言,
FORTRAN也比较好掌握。对科学计算多用
FORTRAN或 PL/Ⅰ ;对商业和管理等数据处理领域,用 COBOL为宜。 C语言虽然也可用于科学计算和管理领域,但并不理想,C的特长不在这里。对操作系统和系统实用程序以及需要对硬件进行操作的场合,用 C语言明显地优越于其他高级语言,有的大型应用软件也用 C语言编写。从教学角度,由于 PASCAL是世界上第一个结构化语言,而曾被认为是计算机专业的比较理想的教学语言。目前在数据结构等课程中一般用
PASCAL语言举例。但 PASCAL语言难以推广到各实际应用领域,
到目前为止基本上只是教学语言。 C语言也是理想的结构化语言,且描述能力强,同样适于教学。 操作系统课程多结合 UNIX讲解,而 UNIX
与 C不可分,因此,C语言已经成为被广泛使用的教学语言。 C除了能用于教学外,还有广泛的应用领域,因此更有生命力。 PASCAL和其他高级语言的设计目标是通过严格的语法定义和检查来保证程序的正确性,而 C则是强调灵活性,使程序设计人员能有较大的自由度,以适应宽广的应用面。总之,C语言对程序员要求较高。程序员使用 C语言编写程序会感到限制少,灵活性大,
功能强,可以编写出任何类型的程序。现在,C
语言已不仅用来编写系统软件,也用来编写应用软件。学习和使用 C的人已越来越多。
1.3 简单的 C程序介绍下面先介绍几个简单的 C程序,然后从中分析 C程序的特性。
例 1.1
main ( )
{
printf ("This is a C program.\n");
}
本程序的作用是输出以下一行信息,
This is a c program.
其中 main 表示“主函数”。每一个 C程序都必须有一个 main
函数。函数体由大括弧 {}括起来。本例中主函数内只有一个输出语句,printf是 C语言中的输出函数 (详见第 4章 )。双引号
(双括号)内的字符串原样输出。,\n”是换行符,即在输出
,This is a c program.”后回车换行。语句最后有一分号。
例 1.2
main ( )/*求两数之和 */
{
int a,b,sum; /*这是定义变量 */
a=123; b=456; /* 以下 3行为 C语句 */
sum=a+b;
printf ("sum is %d/n",sum);
}
本程序的作用是求两个整数 a和 b之和 sum。 /*……*/ 表示注释部分,为便于理解,我们用汉字表示注释,当然也可以用英语或汉字拼音作注释。注释只是给人看的,对编译和运行不起作用。注释可以加在程序中任何位置。第 2
行是声明部分,定义变量 a和 b,指定 a和 b为整型 (int)变量。第 3行是两个赋值语句,使 a和 b的值分别为 123和
456。第 4行使 sum的值为 a+b,第 5行中,%d”是输入输出的“格式字符串”,用来指定输入输出时的数据类型和格式 (详见第 4章 ),,%d”表示
“以十进制整数形式输出”。在执行输出时,此位置上代以一个十进制整数值。 printf函数中括弧内最右端 sum是要输出的变量,现在它的值为
579(即 123+456之值 )。因此输出一行信息为 sum
is 579
例 1.3
main ( )/* 主函数 */
{ int a,b,c; /*声明部分,定义变量 */
scanf ("%d,%d",&a,&b); /*输入变量 a
和 b的值 */
c=max (a,b);/*调用 max函数,将得到的值赋给 c*/
printf ("max=%d",c); /*输出 c的值 */
}
int max(int x,int y) /* 定义 max函数,函数值为整型,形式参数 x,y为整型 */
{int z; /* max函数中的声明部分,定义本函数中用到的变量 z为整型 */
if (x>y) z=x;
else z=y;
return (z); /*将 z的值返回,通过 max带回调用处 */
}
本程序包括两个函数,主函数 main和被调用的函数
max。 max函数的作用是将 x和 y中较大者的值赋给变量 z。 return语句将 z的值返回给主调函数
main。返回值是通过函数名 max带回到 main函数的调用处。 main函数中的 scanf是“输入函数”
的名字 (scanf和 printf都是 C系统提供的标准输入输出函数 )。程序中 scanf函数的作用是输入 a和 b
的值。 &a和 &b中的,&”的含义是“取地址”,
此 scanf函数的作用是将两个数值分别输入到变量
a和 b的地址所标志的单元中,也就是输入给变量
a和 b。这种形式是与其他语言不同的。它相当于
BASIC语言中的 INPUT a,b或 PASCAL语言中的 Read (a,b)。 &a和 &b前面的,%d,%d”的含义与前相同,
只是现在用于“输入”。它指定输入的两个数据按十进制整数形式输入。关于 scanf函数详见第 4
章。
main函数中第 4行为调用 max函数,在调用时将实际参数 a和 b的值分别传送给 max函数中的形式参数 x和 y。经过执行 max函数得到一个返回值 (即
max函数中变量 z的值 ),把这个值赋给变量 c。然后输出 c的值。 printf函数中双引号内的
,max=%d”,在输出时,其中,%d”将由 c的值取代之,,max =”原样输出。程序运行情况如下,
8,5 (输入 8和 5给 a和 b)
max=8 (输出 c的值 )
本例用到了函数调用、实际参数和形式参数等概念,
我们只做了很简单的解释。读者如对此不大理解,
可以先不予以深究,在学到以后有关章节时,问题自然迎刃而解。在此介绍此例子,无非是使读者对 C程序的组成和形式有一个初步的了解。
通过以上几个例子,可以看到,
(1) C程序是由函数构成的。一个 C源程序至少包含一个 main函数,也可以包含一个 main函数和若干个其他函数。因此,函数是 C程序的基本单位。
被调用的函数可以是系统提供的库函数 (例如
printf和 scanf函数 ),也可以是用户根据需要自己编制设计的函数 (例如,例 1.3中的 max函数 )。 C的函数相当于其他语言中的子程序,用函数来实现特定的功能。程序中的全部工作都是由各个函数分别完成的。编写 C程序就是编写一个个函数。 C的函数库十分丰富,ANSI C建议的标准库函数中包括 100多个函数,Turbo C和 MS C 4.0提供 300多个库函数。 C的这种特点使得容易实现程序的模块化。
(2) 一个函数由两部分组成,
① 函数的首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数 (形参 )名、参数类型。
例如,例 1.3中的 max函数的首部为
int max (int x,int y )
↓ ↓ ↓ ↓ ↓ ↓
函数类型 函数名 函数参数类型 函数参数名 函数参数类型 函数参数名一个函数名后面必须跟一对圆括弧,函数参数可以没有,如 main( )。
② 函数体,即函数首部下面的大括弧 {……} 内的部分。如果一个函数内有多个大括弧,则最外层的一对 { }为函数体的范围。
函数体一般包括,
· 声明部分:在这部分中定义所用到的变量,如例
1.3中 main函数中的,int a,b,c;”。 在第 8章中还将会看到,在声明部分中要对所调用的函数进行声明。
执行部分:由若干个语句组成。
当然,在某些情况下也可以没有声明部分 (例如,
例 1.1)。甚至可以既无声明部分,也无执行部分。
如,
dump ( )
{ }
它是一个空函数,什么也不干,但这是合法的。
(3) 一个 C程序总是从 main函数开始执行的,而不论 main函数在整个程序中的位置如何 (main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前,在另一些函数之后 )。
(4) C程序书写格式自由,一行内可以写几个语句,
一个语句可以分写在多行上。 C程序没有行号,
也不像 FORTRAN或 COBOL那样严格规定书写格式 (语句必须从某一列开始书写 )。
(5) 每个语句和数据定义的最后必须有一个分号。
分号是 C语句的必要组成部分。例如,
c=a+b;
分号不可少。即使是程序中最后一个语句也应包含分号 (这是和 PASCAL语言不同的 )。
(6) C语言本身没有输入输出语句。输入和输出的操作是由库函数 scanf和 printf等函数来完成的。
C对输入输出实行“函数化”。由于输入输出操作牵涉到具体的计算机设备,把输入输出操作放在函数中处理,就可以使 C语言本身的规模较小,
编译程序简单,很容易在各种机器上实现,程序具有可移植性。当然,不同的 C语言系统需要对函数库中的函数作不同的处理。不同的 C系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。因此不同的系统所提供的函数个数和功能是有所不同的。
(7) 可以用 /*……*/ 对 C程序中的任何部分作注释。
一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。
1.4 C程序的上机步骤我们已经看到了一些用 C语言编写的程序。为了使计算机能按照人们的意志进行工作,必须根据问题的要求,
编写出相应的程序。所谓程序,就是一组计算机能识别和执行的指令。每一条指令使计算机执行特定的操作。程序可以用高级语言(例如 QBASIC,
FORTRAN,PASCAL,C等)编写。用高级语言编写的程序称为“源程序”( source program)。从根本上说,计算机只能识别和执行由 0和 1组成的二进制的指令,而不能识别和执行用高级语言写的指令。为了使计算机能执行高级语言源程序,必须先用一种称为“编译程序”的软件,把源程序翻译成二进制形式的“目标程序”,然后将该目标程序与系统的函数库和其他目标程序连接起来,形成可执行的目标程序。
图 1.1
在编好一个 C源程序后,如何上机运行呢? 在纸上写好一个程序后,要经过以下几个步骤:上机输入与编辑源程序对源程序进行编译与库函数连接运行目标程序这样几个步骤。
以上过程如图 1.1所示。其中实线表示操作流程,
虚线表示文件的输入输出。例如,编辑后得到一个源程序文件 f.c,然后在进行编译时再将源程序文件 f.c输入,经过编译得到目标程序文件 f.obj,
再将目标程序文件 f.obj输入内存,与系统提供的库函数等连接,得到可执行的目标程序文件 f.exe,
最后把 f.exe调入内存并使之运行。
在了解了 C语言的初步知识后,读者最好上机运行一个 C程序,以建立对 C程序的初步认识。
下面分别就三种不同的环境下运行 C程序作一简单介绍。
1,用 Turbo C 运行 C程序的步骤
Turbo C是在微机上广泛使用的编译程序。它具有方便、直观、易用的界面和丰富的库函数。它向用户提供一个集成环境,把程序的编辑、编译、
连接和运行等操作全部集中在一个界面上进行,
使用十分方便。
为了能使用 Turbo C,必须先将 Turbo C编译程序装入磁盘的某一目录下,例如放在 C盘根目录下一级 TC子目录下。
图 1.2
(1) 调用 Turbo C程序。如果用户的当前目录是
Turbo C编译程序所在的子目录(例如 TC子目录),只需从键盘键入,tc” 命令即可,
C:\TC>tc
屏幕上出现 Turbo C集成环境,见图 1.2所示。从图
1.2可以看到在集成环境的上部,有一行“主菜单”,其中包括下面 8个菜单项,
File Edit Run Compile Project Option Debug
break/watch
用户可以通过以上菜单项来选择使用 Turbo C集成环境所提供的 Turbo C的各项主要功能。以上 8个菜单项分别代表:文件操作、编辑、运行、编译、
项目文件、选项、调试、中断 /观察等功能。
用键盘上的,←,和,→”键可以选择菜单条中所需要的菜单项,被选中的项以“反相”图 1.3形式显示
(例如主菜单中的各项原来以白底黑字显示,被选中时改为以黑底白字显示)。
此时若按回车键,就会出现一个下拉菜单。例如在选中,File”菜单并按回车键后,屏幕上,File”下面出现下拉菜单,见图 1.3所示。它是一个子菜单,提供多项选择。可以用,↓”
键选择所需要的项。例如选择,New”处,并按回车键,表示要建立一个新的 C源程序。
图 1.3
如果选择,Load”,并按回车键,表示要调入一个已有的源文件,此时屏幕上出现一个对话框 (见图 1.4)。要求你输入该文件的名字。用户可输入该文件名,例如,tc1.c,
如果已存在此文件,则系统会将此文件调入内存并显示在屏幕上。此时自动转为编辑 (Edit)状态。
如果原来不存在此文件名,则系统会建立一个以指定的名字命名的新文件。
图 1.4
(2) 编辑源文件。在编辑 (Edit) 状态下可以根据需要输入或修改源程序。
(3) 编译源程序。选择,Compile”菜单并在其下拉菜单中选择,Compile to OBJ”,则进行编译,
得到一个后缀为,obj的目标程序(为方便起见,
在一般书刊中,以上菜单的选择以
,Compile/Compile to OBJ”表示 )。然后再选菜单,Compile/Link EXE file”,进行连接操作,
可得到一个后缀为,exe的可执行文件。也可以将编译和连接合为一个步骤进行。选菜单
,Compile/Make EXE file” 或按,F9”键,即可一次完成编译和连接。在屏幕上会显示编译或连接时有无错误和有几个错误,见图 1.5所示。此时按任何一个键,图 1.5所显示的“编译信息框”
会图 1.5
消 失,屏幕上会恢复显示源程序,光标停留在出错之处。
在屏幕的下半部分显示出有错误的行和错误的原因。根据此信息修改源程序。修改完毕认为无错后,再按,F9”,
再次进行编译和连接,如此反复进行到不显示出错为止。
(4) 执行程序。按,F10”键,在窗口上部的主菜单中某一项处出现“反相”显示(黑色亮块)。
File Edit Run Compile Project Option Debug
Break/watch
用,→”键将亮块移到,Run”,按回车键,在其下拉菜单中选择,Run”项,或直接按 Ctrl + F9键,
系统就会执行已编译好的目标文件。此时,TC
集成环境窗口消失,屏幕上显示出程序运行时输出的结果。如果程序需要输入数据 (如例 1.3),则应在此时,从键盘输入所需数据,然后程序会接着执行,输出结果。
如果发现运行结果不对,要重新修改源程序,可以再按,F10”键,并用,←,使亮块移到,Edit”
处,
按回车键,即进入编辑状态,可以根据需要修改源程序,并重复上述 (2),(3),(4)步,直到得到正确结果为止。
(5) 可以用,Alt”和,X”键 (同时按此两键 ),脱离
Turbo C,回到 DOS命令状态。
此时,可以用 DOS命令显示源程序和运行程序,
C> TYPE tc1.c (列出源程序清单 )
C> tc1 (执行目标程序 tc1.exe)
如果想再修改源程序,可以重新执行步骤( 1),
并输入源程序文件名即可。
2,在 UNIX操作系统下运行 C程序的步骤
(1) 用编辑程序 (如 UNIX系统的文本行编辑程序 ed,
或屏幕编辑程序 vi)将源程序输入计算机,经修改认为无误后,存入文件系统。设用户将源文件定名为 f.c (C源程序的后缀一般定为,.c”)。
(2) 编译。调用 C编译程序 cc对源文件进行编译。可打入命令,
cc f.c
如果在编译过程中发现源程序有语法错误,则系统会输出“出错信息”,告诉用户第几行有什么样的错误。用户应重新调用编辑程序,修改后再进行编译。如此直到编译通过为止。编译时先生成一个汇编语言程序 (即将 C源程序翻译成为一个汇编语言程序 ),然后由编译程序再将汇编语言程序翻译成机器指令程序,即目标程序。目标程序的文件名与相应的源程序同名,但后缀为,.o” (表示它是目标文件),上述源文件 f.c经编译后得到目标程序 f.o。
(3) 连接。将目标程序和库函数或其他目标程序连接成可执行的目标程序。在 UNIX系统下,连接是由 cc自动完成的。最后得到可执行文件,文件名由系统自动确定为 a.out。
如果不想用系统定的文件名 a.out,也可以在编译时自己指定可执行文件名。例如想指定为 f.out,
可以在编译时打入以下命令,
cc -o f.out f.c
它的作用是将源程序 f.c编译成可执行程序,文件名为 f.out。
(4) 执行程序。只需输入可执行文件名即可。例如,
a.out (系统指定的文件名 )
或 f.out (用户指定的文件名 )
3,在 DOS下用 Microsoft C 6.0编译程序运行 C程序的步骤
Microsoft C是微软公司为 IBM系列微机开发的 C编译系统。 MS C 6.0版本提供了多个库函数。老版本的
MS C采用基于 DOS平台的命令行方式。 MS C 6.0增加了基于鼠标和窗口的“程序员工作台”
( programmer's work bench,缩写为 PWB),
它也是一个集成环境。 MS C也是人们常用的 C编译系统之一。目前,大多数使用 MS C的人习惯用命令行方式。因此我们在这里只简单地介绍命令行方式的用法。
(1) 编辑 C源程序。可以用任何全屏幕编辑系统输入和编辑源程序。假设已输入和编辑好的源文件名为 a1.c。
(2) 编译和连接。 MS C提供了一个功能很强的 CL
命令,可一次完成程序的编译和连接。 CL是
Compile和 Link的第一个字母。用法如下:
CL a1.c (对源程序 a1.c进行编译和连接 )
如果在编译和连接时出现“出错信息”,则需要重新编辑 (修改 )源程序。编译和连接完成后,产生一个可执行文件 a1.exe。
(3) 执行程序。只需输入可执行文件名,
a1
即可得到运行结果。以上步骤只需上机试一下,即可明白。
习题
1.1 请根据自己的认识,写出 C语言的主要特点。
1.2 C语言的主要用途是什么? 它和其他高级语言有什么异同?
1.3 写出一个 C程序的构成。
1.4 C语言以函数为程序的基本单位,有什么好处?
1.5 请参照本章例题,编写一个 C程序,输出以下信息,
******************************
Very good!
******************************
1.6 编写一个 C程序,输入 a,b,c 3个值,输出其中最大者。
1.7 上机运行本章 3个例题,熟悉所用系统的上机方法与步骤。
1.8 上机运行本章习题 1.5和 1.6。