文档库 最新最全的文档下载
当前位置:文档库 › 第1章C语言概述

第1章C语言概述

第1章C语言概述
第1章C语言概述

第1章C语言概述

1.1 C语言的历史

作为一种程序设计语言,字母“C”看上去是一个奇怪的名字。但是这个奇怪而好听的语言却是现今最为流行的计算机语言之一,因为它是一种结构化的、高级的、与机器无关的语言。它允许软件开发人员开发程序时无须担心实现这些程序的硬件平台。

所有现代语言的起源都是ALGOL语言,该语言是20世纪60年代引入的。ALGOL 语言是最先使用块结构的计算机语言。尽管它从来没有在美国流行开来,但在欧洲被广泛使用。ALGOL语言给计算机科学界带来了结构化程序设计的概念。20世纪60年代,计算机科学家,如Corrado Bohm、Guiseppe Jacopini和Edsger Dijkstra使这一概念大众化了。随后,又宣布开发了好几种计算机语言。

1967年,Martin Richards开发了一种称为BCPL(基本组合程序设计语言)的计算机语言。该语言主要用于系统软件的开发。1970年,Ken Thompson创建了一种计算机语言,该语言继承了BCPL的很多特性,且就称为B语言。在贝尔实验室,B语言用来开发UNIX 操作系统的早期版本。BCPL和B语言都是“无类型”的系统程序设计语言。

C语言是Dennis Ritchie于1972年在贝尔实验室从ALGOL、BCPL和B语言的基础上发展而来的。C语言利用了这些语言的很多概念,并添加了数据类型的概念以及其他功能强大的特性。由于它是与UNIX操作系统一起被开发出来的,因此它与UNIX有着很强的关联。UNIX操作系统(也是在贝尔实验室开发出来的)几乎完全是用C语言编码的。UNIX 是现今使用最为流行的网络操作系统,也是因特网数据超高速路的心脏。

多年以来,C语言主要用于科研环境下,但最终,随着多种商用C编译器的发布,以及UNIX操作系统的不断流行,在计算机专业中也开始获得广泛支持。今天,C语言可以运行在多种操作系统和硬件平台下。

20世纪70年代,C语言发展为现在所谓的“传统C语言”。自1978年由Brian Kerningham 和Dennis Ritchie著作的The C Programming Language一书的出版,C语言成了最为流行的语言。该书很受欢迎,以至于在程序设计界,C语言就认为是“K&R C”。C语言的快速发展导致了不同版本的语言出现,这些语言类似但往往不兼容。对系统开发人员来说,这是一个严重的问题。

为了确保C语言的标准,1983年,美国国家标准局(American National Standards Institate,ANSI)任命了一个技术委员会来定义C语言的标准。该委员会于1989年批准了一个C语言版本,这就是现在的ANSI C。该本版又于1990年被国际标准组织(International Stardards Organiyation,ISO)批准。该标准于1999年进行了更新。C语言的历史如图1.1所示。

图1.1 C语言的历史

1.2 C语言的主要特性

C语言之所以越来越受欢迎,是因为它具有很多可取的特性。它是一种健壮的语言,其丰富的内置函数集和运算符可用来编写任意复杂的程序。C语言编译器融合了汇编语言的性能和高级语言的特性,因此很适合编写系统软件和商业软件。事实上,市场上很多的C编译器都是用C语言编写的。

用C语言编写的程序高效且运行速度快。这归功于它的各种数据类型和功能强大的运算符。其运行速度是BASIC语言的好几倍。例如,一个计算0~1500的程序,用C语言编写,其运行时间为1秒,而用BASIC语言编写的则要运行50秒。

C语言有32个关键字,其长度取决于其内置函数。C语言有很多标准函数可用来开发程序。

C语言是高度可移植的。这意味着,为某一台计算机编写的C程序,只要稍作修改甚至不用修改就可以在另一台计算机上运行。如果我们计划使用不同操作系统的新计算机时,可移植性很重要。

C语言很适于结构化程序设计,因而要求用户以功能模块的方式来思考问题。这些模

块的恰当结合就可以形成一个完整的程序。这种模块化的结构使得程序的调试、测试和维

护更加容易。

C语言另一个重要特性是它的自我扩展能力。一个C程序基本上是各种函数的集合,这些函数由C函数库支持。我们可以不断地将自己的函数添加到C函数库中去。由于有了这么大量的函数,程序设计就变得简单了。

在讨论C语言的具体特征之前,我们先来看看一个C范例程序,分析并了解程序是如何工作的。

1.3 示例程序1:显示一条消息

请看图1.2所示的一个很简单的程序。

图1.2 显示一行文字的程序

该程序将产生如下的输出:

I see, I remember.

让我们来详细看看该程序。第一行告诉操作系统程序名是main,从这一行开始执行。main()函数是C系统使用的一个特殊函数,用来告诉计算机程序的运行起点。每个程序必须正好有一个main函数。如果有多个main函数,编译器就无法知道哪一个是程序。紧跟在main后面的空括号对表明main函数不带参数。关于参数的概念我们将在讨论函数(第9章)时再详细介绍。

第二行的开始是“{”,表明main函数的开始,而最后一行的闭括号则表示该函数的结束。在上面范例程序中,闭括号还标志着整个程序的结束。这两个括号之中的所有语句就形成了函数体。函数体包含有一个指令集,从而完成指定的任务。

在上面的范例程序中,函数体包含有3个语句,其中只有printf一行是可执行的语句。以/*开始,以*/结尾的行称为注释行。程序中恰当地使用注释行,可以提高程序的可读性。更容易让人理解。由于注释行不是可执行语句,因此/*与*/之间的内容全部被编译器忽略掉。通常,一个注释可以插入到程序的任何空白处——行的开始、中间或结尾处——但不能插入到一个词的中间。

尽管注释行可以出现在程序的任意地方,但在C语言中它们不能嵌套。这就意味着,不能在注释行中再插入注释行。一旦编译器发现了注释的开始标志,它就将忽略掉后面的

所有内容,直到再发现一个结束标志为止。下面注释行:

/* = = /* = = */ = = */

是不合法的,因此将产生一个错误。

由于注释行不会影响程序的运行速度以及编译后程序的大小,因此我们应大方地在程序中使用注释。注释有助于开发人员和其他用户理解程序的不同函数和运算,对程序的调试和测试也有帮助。我们将在后面的范例程序中体会到注释行的作用。

现在让我们来看printf()函数,这是该范例程序中唯一可执行的语句:

printf("I see, I remember!");

printf是预定义的标准的C函数,用于显示输出。预定义的含义就是,该函数已编写好并已编译。在链接时,与我们的程序链接在一起。编译和链接的概念将在本章的后面介绍。printf函数将两个引号之间的内容显示出来。在本范例程序中,其输出为:

I see, I remember!

注意,打印行以分号结尾。C语言的每条语句都必须以分号结尾。

假如我们要如下地将输出显示成两行:

I see,

I remember!

这可以通过添加两个print函数来实现,具体如下:

printf("I see, \ n ");

printf("I remember!");

两个括号之间的信息称为该函数的参数。第一个printf函数的参数是“I see, \ n”,第二个的是“I remember!”。这些参数只是要显示出来的字符串。

注意,第一个printf函数的参数在字符串的末尾包含有字符\和n的组合。该组合称为新行字符。新行字符命令计算机换到下一行(即新行)。在概念上,它类似于打字机的回车键。在显示了逗号字符后,新行字符\n的出现将使“I remember!”显示在下一行。字符\和n之间不允许有空格。

如果省略掉第一个printf语句的新行字符,那么输出仍为一行,即如下所示:

I see,I remember!

这类似于图1.2中的程序的输出。但是,注意,在“,”和“I”之间没有空格。

只使用一个printf语句,只要在适当的地方使用新行字符,也可以生成两行或多行输出。例如,语句:

printf("I see, \n I remember!");

的输出为:

I see,

I remember!

而语句:

printf("I \n see, \n I\n remember!");

I

see,

I

remember!

注意,有些作者推荐在所有程序的开头加上如下的输入输出库函数:

# include

但是,对printf和scanf并没有必要,因为这两个函数已经定义为C语言的一部分了。

关于输入输出函数的更多内容请参见第4章。

在我们继续讨论其他更多的示例之前,必须注意到很重要的一点:C语言是区分大小写字母的。例如,printf和PRINTF并不相同。在C语言中,通常都是写成小写字母。而大写字母用作表示常量的符号名。我们也可以在输出字符串中使用大写字母,例如,“I SEE”和“I REMEMBER”。

上面介绍的用于显示“I see,I remember!”的示例是最简单的程序之一。图1.3列举了这类简单程序的一般格式。所有C程序都需要一个main函数。

main函数

Main函数是每个C程序的一部分。C语言允许有如下多种形式的main函

数声明:

main()

int main()

void main()

main(void)

void main(void)

int main(void)

空括号对表示该函数不带参数。这也可以在括号中使用关键字void来明

确表示不带参数。我们还可以在main之前指定int或void。关键字void

表示该函数不给操作系统返回任何信息,而int表示函数将返回一个整数

值给操作系统。如果指定为int,那么程序的最后一行必须是“return 0;”。

为了简单起见,我们在本书的所有示例程序中使用第一种形式的main函数。

图1.3 简单程序的结构

1.4 示例程序2:两个数相加

下面来看另一个程序,它执行两个数的加法运算并显示其结果。整个程序如图1.4所示。

图1.4 将两个数相加的程序

当运行该程序时,将产生如下的输出:

100

106.10

该程序的头两行为注释行。在开始处添加注释行,用于给出诸如程序名、作者、编写日期等信息。这是一种很好的做法。其他行中也使用了注释符号,用于表示行号。

number和amount字为变量名,用来存储数字数据。数字数据可以是整数型或实数型。在C语言中,所有变量都必须进行声明,从而告诉编译器所使用的变量名是什么、它们的数据类型是什么。变量必须在使用之前声明。在第5和第6行中,变量声明语句:

int number;

float amount;

告诉编译器number为整数型(int为integer的缩写),而amount为浮点型(float)。声明语句必须像图1.4所示的那样出现在函数的开始处。所有声明语句以分号结尾。C语言还支持多种其他类型的数据,详细讨论见第2章。

int和float之类的字称为关键字,不能用作变量名。第2章将给出关键字的一个列表。

通过把数值赋给变量后,数据就保存在该变量中了,如第8和第10行所示的那样。在第8行中,整数值100赋给了整型变量number,而在第10行,实数30.75与75.35之和赋给了浮点变量amount。语句

number=100;

amount=30.75+75.35;

称为赋值语句。每个赋值语句的结尾必须有一个分号。

下一个语句为显示number值的输出语句,语句

printf("%d \n", number);

含有两个参数。第一个参数%d \n告诉编译器,第二个参数number的值必须显示为十进制整数。注意,这些参数之间是用逗号分隔开的。新行字符可以使下一个输出出现在新的一行中。

程序的最后一个语句

printf("%5.2f", amount);

以浮点格式显示amount的值。格式说明%5.2f告诉编译器,该输出必须是浮点数,且总共有5位,其中小数点后有2位。

1.5 示例程序3:利息计算

图1.5中的程序用于计算每年年末的投资金额。假设利息为11%。用两列显示出年份机器相应的金额数目。其输出如图1.6所示。该图显示了初始资金为5000.00,10年之中的利息情况。该程序使用的是以下计算公式:

图1.5 投资问题的程序

图1.6 递增程序的输出

年末值=年初值×(1+利息率)

在本程序中,变量value表示年末的数额,而amount表示年初的数额。语句:

amount = value;

把当年年末的数值赋给了amount变量作为下一年年初的数值。

让我们来看看该程序引入的一些新特性。第2和3行是以#define开头的指令。#define 指令定义了将在程序中使用的符号常量的值。当遇到一个符号名时,编译器自动用与该名称相关的值替代。如果需要修改其数值,只需修改定义即可。在本程序中,我们定义了两个符号常量PERIOD和PRINCIPAL,并各自赋给值10和5000.00。这些值在程序的整个运行中保持不变。

注意,预定义常量是不可改变的。我们不能在程序中使用赋值语句来修改它们的值。例如,语句:

PRINCIPAL = 10000.00;

是不合法的。

#define指令

#define指令是一个预处理编译器指令,而不是程序语句。因此,#define

不能用分号结尾。符号常量通常写成大写形式,这样它们就很容易与小

写字母的变量名区分了。符号常量不在声明部分中声明。关于预处理指

令的内容将在第14章中详细讨论。

程序的声明部分把year声明为整型,amount、value和inrate声明为浮点型。注意,本程序将所有浮点变量声明在一个语句中了。它们也可以这样声明:

float amount;

float value;

float inrate;

当两个或多个变量声明在一个语句中时,它们之间用逗号分隔开。

所有的计算和显示在一个while循环中完成。while用于反复计算一个或一组语句。在本程序中,只要year的值小于或等于PERIOD的值,就将执行while后面的4条语句。注意,这4条语句用括号括起来了。当year大于PERIOD时,将退出该循环。关于循环的概念和类型将在第6章中讨论。

C语言支持4种基本的算术运算(+、-、×、/)以及其他一些运算符,详细内容将在第3章中介绍。

1.6 示例程序4:子例程的使用

到目前为止,我们只使用了C系统所提供的printf函数。图1.7所示的的程序使用了一个自定义函数。在C语言中,自定义函数等同于FORTRAN语言中的子例程或BASIC 中的子程序。

图1.7 使用自定义函数的程序

图1.7显示了使用mul()函数的示例程序。该程序显示以下输出:

Multiplication of 5 and 10 is 50.

当用以下语句调用mul()函数时,该函数将x与y的值相乘,并将结果返回到main()函数:

c = mul(a, b);

mul()函数有两个参数x和y,它们被声明为整型。当调用mul()函数时,a和b的值被各自传递给x和y。自定义函数的详细内容将在第9章中介绍。

1.7 示例程序5:数学函数的使用

我们经常要使用标准数学函数,如cos、sin、exp等。下面我们来看看在程序中如何使用一个数学函数。标准数学函数定义并保存在C的函数库中。如果我们需要使用这些函数,就必须在程序中添加#include指令。与#define一样,#include也是一个编译器指令,它告诉编译器从函数库中链接指定的数学函数。使用形式为:

#include

math.h是含有所需函数的文件名。图1.8说明了cos函数的使用。该程序分别计算0、10、20、……、180度角的cos值,并显示出标题和结果。

经常要用到的另一个#include指令是:

#include

stdio.h指的是标准输入/输出头文件,它包含了标准输入输出函数。

相关文档