当前位置:网站首页>>电脑技术>>C、C++语言>>我的著作 双击自动滚屏
C语言速成(第一章 C语言概述)

发表日期:2006年1月1日      已经有9548位读者读过此文

第 一 章  C语言概述

    C作为一个通用的程序设计语言,由于它的紧凑、高效、易于移植、模块化等特点已被广泛地应用于系统程序设计、人工智能、文字处理、科学计算、计算机绘图等领域,而且越来越为广大的程序员所喜爱。本章主要介绍C语言的一些最基本的知识,使读者对C语言有一个概括的了解。

第一节  C语言的由来及特点

    一、C语言的由来
    C语言是 UNIX 操作系统的主程序设计语言。它首先是在 UNIX 上实现的。现在的UNIX操作系统百分之九十的程序和绝大多数实用例程以及工具,都是用C语言开发的。C语言在其早期的发展过程中,与 UNIX 系统有着相互依存、休戚相关的关系。
    最初的 UNIX 系统是用汇编语言编写的。但由于汇编语言的移植性、程序开发效率及易读性都不如高级语言,因此人们希望有一种既能象汇编语言一样能对硬件进行操作,又具有高级语言可读性、移植性强特点的新语言。C语言就是适应这种需要而产生的。
    1970年美国 AT&T 公司贝尔实验室的 Ken  Thompson 对一种比较贴近硬件的语言 BCPL 进行了简化,设计出更为接近硬件的B语言,并用它改写了 UNIX 操作系统。后来为了克服B语言过于简单、功能不强和生成的解释代码运行速度慢的弱点,1972年贝尔实验室的 Dennis Ritchie 在B语言基础上设计了C语言,第二年他和 Ken Thompson 合作又用C语言重写了 UNIX 操作系统。经用C语言改写的 UNIX 其代码量比以前的版本扩大了三分之一,加进了多种程序设计的功能。今天使用的 UNIX 版本都是在此基础上扩充、发展起来的。
    整个 UNIX 系统是建立在C语言基础上的,1975年出现了第一个“可移植的C编译语言”,为 UNIX 系统的移植创造了良好的条件。UNIX 开始为众多的机型所采用。而 UNIX 的发展又有力地推动了C语言的发展和应用。
    七十年代末,随着微型机的迅速发展,C语言开始移植到非 UNIX 系统上。各种应用于微机的非 UNIX 的C编译语言版本陆续出现,C语言脱离了 UNIX 成为一个独立的通用程序设计语言。
    多年来,人们在实现各自的C编译时,是参照1978年 Kernighan、Ritchie 的《C语言参考手册》中的定义。本书后面许多地方提到的“老版本”,就是指以这本书为基础的C语言版本。但在C语言的发展过程中,由于各自实现环境的不同,导致了C编译版本的庞杂,不利于C程序之间的交流。1983年,美国国家标准协会 ANSI 在继承和发展的基础上开始着手制定新的C语言标准。 本书着重介绍的 Microsoft C和 Turbo C已实现了大部分的 ANSI 标准的规定,并作了部分扩充,这是当前在微机上应用最广泛的两种C语言版本。当然,C语言是在实践中产生和发展起来的,而且继续还在实践中不断发展和完善。

    二、C语言的特点
  相对于其他计算机语言,C语言有着下列明显的优点:
    1、C语言代码紧凑、高效,是表达能力很强的语言。它是一种程序员的语言,它的表达能力足以代替汇编语言,而又具有高级语言的许多功能,在易读、易写、易查错、易维护和独立于机器方面远胜于汇编语言。这样就大幅度地提高了软件的开发效率。C语言程序的目标码的执行效率仅比汇编程序低10-20%。而且由于语句表达简练,编译时又不作太多的完全检查,编译效率是其他语言所不能比拟的。
    2、C语言是一种中级语言,相对“低级”。它能对计算机硬件进行操作,能直接访问物理地址和进行字位操作。它对数组越界和函数调用时参数匹配一般不作检查,而且它在低层的基本数据类型可以任意转换。因此它快速、方便,适应程序员希望限制少、设计自由度大的要求,但同时也带来了安全性差的副作用。
    3、C语言相对小。仅有四种基本数据类型,32个关键字,语法规则也不复杂。小巧的核心使编译程序小,可在小机器上开发系统和应用软件。由于小,学习和熟练C语言并不难。但C语言系统虽小,由于有大量的库函数支持和可以由基本数据类型构造出各种复杂的组合数据类型,并可以采用分别编译,它的描述能力没有受到限制,能用它组合成庞大的程序系统。
    4、C语言提供了多种结构化的控制语句,是理想的结构化语言。C程序文件可以分割成几个源文件分别进行编译。它以分立的函数为基础能够实现程序的模块化,特别适合于大型程序的模块化设计,因此C语言是一种具有现代风格的程序设计语言。
    5、C语言有很好的移植性。大部分代码不改动就可把编译程序从一个机器上移植到另一个机器上。C语言的众多微机版本快速形成产品也归功于它的移植性。随着近年来C语言以及 UNIX 标准化的开展,C语言的可移植性更有保障。
   6、C语言有丰富的运算符和设计结构,灵活地运用它们可以实现各种复杂的运算,它对各种不同类型程序设计有很好的适应性。目前在系统软件、控制工程、科学计算、数据分析、图形处理、文字编辑乃至人工智能,几乎所有的应用领域都在广泛地使用C语言。
    当然C语言和其他计算机语言一样也存在着一些不足。C语言最大的不足在于其安全性,这是由于C语言的数据和指针没有屏障,类型转换比较随便,对数组越界及变量类型一致性不作语法上的严格检查等原因所造成的。然而安全性虽是最大但又不是非克服不可的缺点,只能以辨证的观点来看待它。1988年的 ANSI C标准,对C的安全性作了增补,但始终不把C改造为强类型的安全语言,旨在保持C语言高效、灵活和编程快速的特色。实际上安全性很大程度上取决于程序员的编程风格和水平,因此要强调由程序员自己去保证程序的正确性,要求在编程和移植时应特别小心。

第二节  一个简单的C语言例程的编译与运行

    计算机无法直接执行C语言的源程序,必须先经过编译程序把源程序变成机器可直接执行的代码,然后执行。由C源程序的编写直到可执行代码的产生,中间需要以下几个步骤:
    1、由编辑程序产生源程序文件;
    2、对源程序文件进行编译,形成目标文件;
    3、把目标程序同必要的库函数连接在一起,形成可执行文件;
    4、执行程序。
    下面通过一个最简单的C语言程序来说明C语言是如何编译和运行的,以便让读者一开始就能对C语言有一个初步的概念:

    例1.1 在屏幕上打印字符串“欢迎你参加中国计算机函院C语言提高班的学习!”。
    1、用字处理软件编辑一正文文件 HY.C;

  /* 文件名:HY.C */
    main()                             /* 主函数,是执行时的起始点*/
    {
       printf("欢迎你参加C语言的学习!");
                                       /* 把双引号包围的内容输出到屏幕上 */
    }

    2、用C语言编译系统的编译命令对 HY.C 源程序进行编译,产生目标文件 HY.OBJ;
    3、用连接程序(如 LINK )将目标文件 HY.OBJ 连接成一个可执行的文件 HY.EXE;
    4、在 DOS 下运行  HY.EXE  文件得出结果。
   
    运行结果为:

    C:>HY <CR>
    欢迎你参加C语言的学习!

    <CR> 为按回车键。HY.C 是源程序文件名。C语言源程序文件名必须带扩展名“.C”。关于C语言程序的编译好连接方法,请参考本书的第十一章。
    这个例子只完成一个功能,即在屏幕上打印一个字符串。从这个例程中可以看到,C语言是由若干个称为“函数”的段组成的,函数是C语言的基本程序单位。本例中函数 main 是程序的主函数。每个C语言程序都必须有一个主函数,C语言规定这个主函数必须命名为 main。主函数 main 的第一条可执行语句即为此程序的开始点,main 通常采用直接调用其他函数的方式控制着整个程序的执行。程序的停止点常是 main 函数的最后一条可执行语句,当然有时也可能停在程序中的其他语句上,这取决于执行的具体情况。程序里的一对花括号 “{”和“}”标识函数体的开始和结束。
    在一个C语言程序里至少包含一个函数,即 main 函数,但在通常情况下,C语言的源程序总是还包含多个其他函数,它们可以是系统提供的标准库函数,也可以是由编程者自己编制并命名的函数。这些函数可以看成相当于其他语言中的子程序。一个函数名后必须跟一对园括号“(”和“)”,括号里可以带若干个参数,本例中的 main 函数没有带参数。在例程中还有一个函数 printf,这是一个由系统提供的库函数,它的作用是向系统指定的输出设备按指定格式输出若干个数据信息。在本例中, printf 把双引号间的一个字符串参数输出到计算机屏幕上。对于格式化输出函数 printf 的用法,后面还要作比较详细的介绍。
    在上面的例程中,我们还可以看到C语言的语句都是以分号“;”作为结束符的。C语言是一种不强调书写格式的程序语言,它的书写是比较自由的。一个语句可以分几行写,也可以把用分号分隔的几个语句写在同一行。程序中“/*”和“*/”之间的部分为注释,它是供程序员看的,对程序的编译和运行不起作用。注释的个数不受限制,它可以放在源程序文件里任何允许插入空格的地方。ANSI标准不支持嵌套注释,因此,在一般情况下不要使用嵌套注释。

第三节  C语言的基本词法

    一、C符号集
    C符号集包括字母、数字以及对C编译器有特殊意义的标点符号。C程序就是通过将C符号集中的字符组合成为有意义的语句加以构造的。C符号集是计算机系统可表示符号集的子集。除了字符串常量、字符常量和注释可以使用任何可表示的字符外,C程序只能包含C符号集中的字符。 当C编译器遇到误用的字符或者不属于C符号集的字符时,它就产生错误信息。C符号集包括以下几部分:

  1、字母、数字和下划线
    C符号集中的大写英文字母( A─Z )、 小写字母( a─z )、阿拉伯数字( 0─9 )以及下划线( _ )可以用来组成后面将要介绍的常量、标识符和关键字。
    需要注意:C编译器把大写字母和小写字母当作不同的字符。如果在一个给定的项中规定一个小写字母 a,在使用这个项时就必须使用该小写字母,而不能用一个大写字母 A 代替。
    下划线起一个字母的作用。所以在构成标识符等语法成份时,可以以下划线打头,这在其它很多高级语言中是不允许的,而在C语言中则是合法的。

    2、空白符
    空格符、水平和垂直制表符、回车符、换行符、换页符都称为空白符。在程序中这些字符将用户定义的项,例如常量和标识符,同其他的项分隔开来。另外,在C语言中注释也被当作空白符。C编译器忽略各空白符,除非它们用作分隔符或者作为字符串的成分。这意味着可以使用额外的空白符来增加程序的可读性。

    3、标点符号和特殊符号
    C字符集中的标点符号和特殊字符有多种用途,有些用于从组织程序文本到定义编译器或编译的程序所要执行的任务,如代表或组合成各种运算符;有些则只能出现在字符串常量和注释中。在本书后面的章节里将会陆续讲到它们。

    二、运算符
    运算符是一些特殊字符的组合,它们规定对数值如何进行比较、转换和赋值。另外还有一个特殊的运算符 sizeof,用于测量一个数据类型的长度字节数。运算符有规定的优先级和结合特性这些将在下一章再作详细的介绍。

   三、转义字符
   转义字符是个特殊的字符组合,它们在字符串和字符常量中表示空白符和非字符。它们的典型用法是规定终端和打印机的动作,如回车和制表动作,以及提供通常有特殊意义的字符的文字量表示,如双引号字符。转义字符由一个反斜杠及跟着的一个字母或者若干个数字组成。表1.1列出C语言的转义字符序列。

    转义字符        含  义          转义字符         含   义 
  ─────────────────────────────────────
       \n          换    行            \a         响铃(告警)
       \t          水平制表            \''''''''''''''''         单 引 号
       \v          垂直制表            \"         双 引 号
       \b          退    格            \\         反 斜 杠
       \r          回    车            \ddd       八进制数表示的 ASCII 字符
       \f          换    页            \xhh       十六进制数表示的 ASCII 字符

                        表1.1 转义字符序列表

    如果在一个反斜杠后面有一个不在上述表中的字符,则忽略反斜杠而将该字符表示为文字常量。例如:在字符串常量或字符常量中,\c 表示字符 c。

    四、标识符   
    标识符是程序中所使用的常量、变量、函数和数据类型等标号的名字。例如可以生成一个标识符,用它说明一个变量或函数,然后在程序的其他语句里使用该标识符来引用该项变量或者函数。
    标识符是一个字符序列,它必须以一个英文字母或下划线开头,后跟零个或多个字母、 数字或下划线。一个标识符允许有任意多个字符,但在不同的系统上,标识符的有效字符数是不同的。ANSI C标准规定标识符的有效位数不少于31个字符。
    选取标识符应尽量做到简洁、易识别,并能尽可能表达其显见的含义,以增强程序的可读性。打头的下划线必须小心使用,因为习惯约定以下划线打头的标识符通常是作为系统例程专用的。下列为合法的标识符的例子:

        a     p3    write_char    MAX    prog_12   _sum

但下面的标识符则是不合法的:

        5a    &H    write-char   pe.a

    由于C编译器将大写字母和小写字母当作不同的字符。因此,大小写字符不同的组合可以产生不同的标识符。例如,标识符 CH、Ch、cH 彼此就是不同的。

    五、关键字
    关键字是系统为特定目的而保留的一些单词,它们对C编译器有着特殊的含义。C语言将这些关键字定义成数据类型符、语句定义符和存储类型符。它们只能按定义加以使用,而不能当作常规的标识符使用。要注意,在程序中选用变量名、函数名等标识符时,不能同关键字发生冲突。ANSI C标准规定了以下关键字,这些关键字均由小写字母组成:

    auto            double          int             struct
    break           else            long            switch
    case            enum            register        typedef
    char            extern          return          union
    const           float           short           unsigned
    continue        for             signed          void
    default         goto            sizeof          while
    do              if              static          volstile

    除此之外,一些C语言版本如 Turbo C等还增添了一些别的关键字。关键字不能重新定义,但是通过使用某些指令,可以规定用其他文本符号来取代一些关键字。
    下面七个字虽然不属于关键字,但建议读者把它们看成关键字,不要在程序中随意使用,以免造成混淆:

    define  undef  include  ifdef  endif  line

    这些字主要用在C语言的预处理程序中。

第四节  C语言程序的基本结构

    在第二节里,我们用一个十分简单的C语言程序介绍了一些C程序的基本要素。下面再举一个例子来分析一下C语言程序的基本结构:

    例1.2 比较给定的两个数大小,在屏幕上显示大的那个数。

    #define ONE 1                      /* 预处理命令,用符号常量代替常数1 */
    #define TWO 2                      /* 预处理命令,用符号常量代替常数2 */
    int z;                             /* 外部变量说明 */
    int max();                         /* 外部函数说明 */
    main()                             /* 主函数 */
    {
       int x=ONE, y=TWO;               /* 定义局部变量和初始化 */
       z=max(x,y);                     /* 调用函数 max,返回值赋给 z */
       printf("%d",z);                 /* 在屏幕上打印变量 z 的值 */
    }

    int max(a,b)                       /* 函数定义 */
    int a,b;                           /* 函数形式参数说明 */
    {
       if(a>b) return(a);              /* 如果 a>b,返回 a 的值 */
       else  return(b);                /* 否则,返回 b 的值 */
    }

    在例程中,最前面的两句是预处理程序。通过用 # 开头的预处理命令 #define 用标识符 ONE 替换常数1,用 TWO 替换2。第三、第四句分别为外部变量说明语句和外部函数说明语句。和例1.1中一样,main 是主函数,在 main 的函数体内定义了两个局部变量 x 和 y,并用 ONE 和 TWO 的值将它们初始化。 main 函数体中有两句执行语句:一句是调用函数 max,并将函数的返回值赋给变量 z,括号中的 x、y 是传递给函数的参数,称为实参。另一句是调用库函数 printf 在屏幕上根据格式转换说明代码 %d 的要求用十进制方式打印变量 z 的值。 程序下面部分定义了函数 max,括号里的 a、b 是和调用该函数时的实参相对应的参数,称为形参。控制 max 函数执行流程的是一组复合条件语句:如果形参 a 大于 b ,函数 max 返回 a 的值,否则返回 b 的值。控制语句 return 是一个返回语句,它返回一个值给调用函数,并把程序的控制权交还给调用程序。 return 后面的表达式可以带括号,也可以不带括号。
    上述程序大体上反映了一个C语言源程序的主要结构。 图1.1是C语言程序的基本结构示意图:

                  预处理语句
                  全局数据描述
                  main()
                  {
                     局部数据描述
                     执行语句
                  }
                  函数1()
                  {
                     局部数据描述
                     执行语句
                  }
                  函数2()
                  {
                     局部数据描述
                     执行语句
                  }
                    .
                    .
                    .
                  函数N()
                  {
                     局部数据描述
                     执行语句
                  }

               图1.1  C语言程序基本结构示意图

    关于预处理命令、变量、函数和参数等将在以后的章节里陆续向大家介绍。各函数在程序中排列的位置并不十分重要,main 函数也可以放在其他函数的后面,但程序总是从 main 函数的第一条语句开始执行。
    从上面的程序里不难看出,函数是C语言程序的主要骨架,C语言最基本的特点是它的函数性:C程序均由函数组成,此函数调用彼函数,形成大的系统。学习C语言,主要要掌握两个方面:一编写正确有效的新函数;二是正确有效地使用C语言系统的标准库函数。
    在C语言的程序设计中,养成良好的程序设计风格非常重要,应习惯于用多个小函数来构成一个大程序。应该尽量把一个大程序分解成若干个各自完成一个独立功能的小模块。我们可以把这些小功能模块看成“零件”,需要时就可以用这些“零件”组成“机器”,而不必每次都重新做起。


相关专题: 我的著作
专题信息:
  C语言速成(第三章 程序控制语句)(2006-1-1 13:51:28)[9375]
  C语言速成(第七章 联合、枚举和自定义数据类型)(2006-1-1 13:51:46)[9993]
  C语言速成(第六章 结构)(2006-1-1 13:52:05)[8790]
  C语言速成(第五章 指针)(2006-1-1 17:28:54)[4524]
  C语言速成(第四章 数组)(2006-1-1 13:52:42)[4666]

相关信息:
 没有相关信息
  打印本页
设为首页 | 加入收藏 | 联系我们 | 管理入口
皖ICP备05018956号
Copyright © 2003 J.W.SHEN All Rights Reserved
后台管理系统 V1.0 制作