C语言概述.docx

上传人:b****4 文档编号:3741892 上传时间:2022-11-25 格式:DOCX 页数:14 大小:31.41KB
下载 相关 举报
C语言概述.docx_第1页
第1页 / 共14页
C语言概述.docx_第2页
第2页 / 共14页
C语言概述.docx_第3页
第3页 / 共14页
C语言概述.docx_第4页
第4页 / 共14页
C语言概述.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C语言概述.docx

《C语言概述.docx》由会员分享,可在线阅读,更多相关《C语言概述.docx(14页珍藏版)》请在冰豆网上搜索。

C语言概述.docx

C语言概述

第1章C++语言概述

C++语言是一种优秀的面向对象程序设计语言,它在C语言的基础上发展而来,但它比C语言更容易为人们学习和掌握。

C++以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。

面向对象的设计思想是在原来结构化程序设计方法基础上的一个质的飞跃,C++完美地体现了面向对象的各种特性。

在学习C++之前,我们先介绍C++的历史、面向对象的基本概念以及一个基本的C++程序的结构,最后讲解在MicrosoftVisualC++6.0下如何编写C++程序,并编译执行。

本章的学习重点是:

C++的特点

面向对象的基本概念

C++程序的结构和实现

 

1.1C++语言的历史

1.1.1C++的出现

自1946年世界上第一台电子计算机问世以来,计算机科学及其应用发展十分迅猛,计算机已将人类带入了一个新的时代——信息时代。

计算机由硬件系统和软件系统两大部分构成,硬件是指计算机的物理设备,而软件可以说是计算机的灵魂,有了软件,计算机才能灵动起来,成为一台真正的“电脑”。

所有的软件,都是用计算机语言编写的。

计算机程序设计语言的发展,经历了从机器语言、汇编语言到高级语言的历程。

现在各种语言种类繁多,总的来说可以分为下述几类。

1.汇编语言

汇编语言由机器语言发展而来,两者都属于低级语言。

机器语言编写的程序代码是由二进制的“0”和“1”组成的,可由机器识别的指令序列。

机器语言直接面向计算机硬件,人们很难读懂,因而现在几乎不用了。

汇编语言将CPU指令用英文单词代替,将机器指令翻译成人们可以读懂的指令形式。

汇编语言是现在使用效率最高的的计算机语言,功能也最为强大。

但用汇编语言编写的程序很长,工作量极大。

现在汇编语言只用于在功能较弱的处理机(如单片机)上编写程序,或用在对效率要求很高的程序段中。

2.解释型语言

解释型语言编写的程序不会被全部翻译成机器指令形式而后执行,它由一个解释程序实时地处理每个要执行的语句。

由于对于程序中的循环语句要反复解释多次,程序翻译成机器语言后难以有效地优化,所以解释型语言的效率都不高。

典型的解释型语言是COBOL、BASIC语言等。

3.编译型语言

现在应用最为广泛的基本上都是编译型语言,例如Fortran、Pascal、C、C++、Java、Delphi等。

编译型语言通过编译程序将程序员编写的程序代码翻译成机器指令,生成可执行文件。

编译型语言编写的程序执行效率很高,编译程序的构造也较解释程序简单,但一般情况下其语法的限制比解释型语言更为严格。

注意:

计算机语言(程序语言)的分类。

除机器语言和汇编语言属于低级语言之外,其他语言都属于中高级语言(中级和高级的划分并不是非常严格)。

所有的语言最终都要翻译成机器代码后才能由计算机执行。

“翻译”可分为解释型和编译型两种,解释型语言(如Basic)是边执行边翻译,编译型语言则是在全部程序代码都翻译成机器代码、生成目标程序后才开始执行。

C语言是一种高效的编译型结构化程序设计语言。

C语言最早由贝尔实验室的DennisRitchie在B语言的基础上开发出来,并于1972年在一台DECPDP-11计算机上首次实现。

C语言是作为UNIX操作系统的开发语言开始为人们所接受的,现代的系统级软件基本上都是用汇编语言和C语言编写的。

C语言通常称为中级计算机语言。

中级语言并没有贬义,不意味着它功能差、难以使用或者比BASIC、Pascal那样的高级语言原始;也不意味着它与汇编语言相似,会给使用者带来类似的麻烦。

C语言之所以被称为中级语言,是因为它把高级语言的成分同汇编语言的功能结合起来了。

在过去20年里,C语言已经能够应用于绝大多数类型的计算机上了,同时C语言的发展也导致不同的C语言版本的出现。

这些不同版本的C语言通常是不兼容的。

为了明确定义一种与机器无关的C语言,1989年美国国家标准协会制定了C语言的标准(ANSIC)。

C语言具有以下优良的特点使得它得以风靡全球:

(1)由于C语言的严谨设计,使得用C语言编写的程序具有很好的可移植性。

一般认为C语言与硬件无关。

(2)语言简洁、紧凑,使用方便、灵活。

与其他语言相比,用C语言编写的代码更为简练,程序的书写更为自由。

(3)C语言有极为丰富的数据类型和运算符。

C语言提供指针,可以直接访问内存,能进行位操作,从而使其能够胜任开发操作系统的工作。

(4)生成的目标代码质量高,程序执行效率高。

各种要求较高的算法和系统软件大都用C语言编写。

C语言在盛行时也暴露出了它的局限性:

(1)C语言类型检查机制较弱,这使得程序中的一些错误不能在编译时被发现。

(2)C语言本身几乎没有支持代码重用的机制,这使得各个程序的代码很难为其他程序所用。

(3)对大型的软件项目,程序员很难控制程序的复杂性。

为解决日益增长的软件需求,避免C语言的不足,1980年贝尔实验室的BjarneStroustrup开始对C语言进行改编,1983年正式命名新的语言为C++语言,在经历了3次C++版本的修订后,于1994年制定了C++的标准ANSIC++标准的草案。

目前C++仍在不断的发展中。

1.1.2C和C++的关系

C++包含了整个C,C是建立C++的基础,因而可以认为C是C++的一个子集。

C++包含了C的全部特征、属性和优点,同时增加了面向对象编程的完全支持。

1.C++保持与C语言的兼容

这种兼容性最明显的表现是大部分C程序不需修改即可在C++的环境下编译执行。

用C语言编写的许多库函数和应用软件都可用于C++。

一个C语言的程序员可以很快成为一名C++程序员,只要掌握了C++中面向对象的成分。

但是,这种兼容性使得C++不是一种纯粹的面向对象程序设计语言。

C语言是一种面向过程的结构化程序设计语言,C++与C兼容就意味着C++也要支持面向过程的程序设计。

C++中的数据并不全部都包装成对象,允许用户使用简单数据类型和不属于任何类的函数和数据。

这种特性使得C++比一般的面向对象语言更灵活,但也容易造成风格上的紊乱,使得初学者感到困惑。

2.C++增加了很多新的概念

C++保持了C语言的简洁、高效、灵活等优点,同时又对C语言的不足和问题作了很多改进:

(1)增加了一些新的运算符,使得C++应用起来更为方便灵活,例如:

:

:

,new,delete,->*等,这使得C++表达能力更强;并且在C++中允许运算符重载,程序员可以定义已有运算符在特定对象上的运算规则,另外还可以定义新的运算符。

(2)C++语言更为灵活。

C++解除了C中对变量说明的限制。

在C语言中,函数中的变量必须在执行语句前说明;而在C++中,可以在函数中的任何位置说明变量,甚至可以在语句内说明变量。

标识符的作用域种类更多,变量的生存期最小可以是块级。

输入和输出可以采用流方式,形式更为简洁。

函数中允许设置默认函数参数,函数调用更为方便,尤其是当函数参数较多时。

(3)引进了引用类型。

引用是对指针的一种改进,这样函数的参数传递就有传值和传地址两种方式,同时给函数返回值带来很大方便。

(4)支持面向对象编程。

C++全面支持面向对象的各种技术,支持类和对象。

允许类的继承、虚函数和纯虚类、函数重载。

这些措施提高了编程的灵活性,减小了程序员的负担。

又引进了内联函数的概念,提高了程序的效率。

3.C++是一种面向对象程序设计语言

C++和C的本质差别在于:

C++是面向对象的,而C是面向过程的。

因此,C++是在对C语言改进的基础上,又增添了支持面向对象的特性。

但是C++并不是完全抛开了C的成分,面向对象是对原来设计方法的一种发展。

在本书中前5章讲述的内容主要是与C语言兼容的部分,其后各章主要讲述面向对象的编程方法。

对于C语言程序员可以直接从第6章开始学习。

1.2面向对象程序设计的基本思想

1.2.1面向对象的由来和发展

20世纪60年代的Simula67是面向对象语言的鼻祖,首次明确提出了类和对象的概念。

对象代表着待处理问题中的一个实体,在处理问题过程中,一个对象可以以某种形式与其他对象通信。

从概念上讲,一个对象是既包含数据又包含处理这些数据操作的一个程序单元。

类用来描述特性相同或相近的一组对象的结构和行为。

该语言还支持类的继承,可将多个类组成为层次结构,进而允许共享结构和行为。

后来出现的Smalltalk语言是第一个比较成功的面向对象语言,对后来面向对象语言的发展产生过重大影响。

该语言丰富了Simula中类和对象的概念,信息也更加隐蔽,程序设计就是向对象发送信息。

20世纪80年代以后,面向对象的程序设计语言广泛应用于程序设计,并且有许多新的突破。

特别是随着操作系统和软件项目日益庞大,人们日益需要一种更高效的开发方式,这更加推动了面向对象语言的发展。

1.2.2面向对象的要素

面向对象的系统包含了3个要素:

对象、类和继承,这3个要素反映了面向对象的传统观念。

面向对象的语言应该支持这3个要素。

首先,应该包括对象的概念。

对象是状态和操作的封装体,状态是存储操作结果的。

满足这一点的语言被认为是基于对象的语言。

其次,应该支持类的概念和特征,类是以接口和实现来定义对象行为的样板,对象是由类来创建的。

支持对象和类的语言被认为是基于类的语言。

最后,应该支持继承,已存在的类具有建立子类的能力,进而建立类的层次。

支持上述3个方面的语言称为面向对象的语言。

按这一标准来衡量,C++是面向对象的语言。

下面将对象、类和继承这些面向对象方法中特别重要的概念解释一下。

在本书后面讲解C++语言的过程中还会反复讲解这些概念,因为它们是理解和掌握面向对象程序设计语言的关键。

1.对象

从概念上讲,对象代表着正在创建的系统中的一个实体。

例如,在一个学校管理系统中,像学生、教师、成绩单等都是对象,这些对象对于实现系统的完整功能都是必要的。

从实现形式上讲,对象一个属性(状态)和操作(方法或行为)的封装体。

属性是由对象中变量的内容和值定义的,例如学生有年龄、性别、入学日期等属性。

各个对象的属性值互不相同。

操作是一系列的实现步骤,它能够完成特定的功能,例如对学生可以有选课、毕业等操作。

在C++中,对象的状态由成员变量的值表示,操作由对象的成员函数完成。

对象实现了信息隐藏,对象与外部是通过操作接口联系的,操作的具体实现外部是不可见的。

封装的目的就是阻止非法的访问,操作接口提供了这个对象的功能。

对象是通过消息与另一个对象传递信息的,每当一个操作被调用,就有一条消息被发送到这个对象上,消息带来将被执行的这个操作的详细内容。

在C++中,向对象发送消息就是调用对象的成员函数,从而获取对象的状态信息或是对对象的状态进行修改。

2.类

类是对象的模板,它包含所创建对象的状态描述和方法的定义。

类的完整定义包含了外部接口和内部算法以及数据结构的形式。

由一个特定的类所创建的对象被称为这个类的实例,因此类是对象的抽象及描述,它是具有共同行为的若干对象的统一描述体。

类是抽象数据类型的实现。

一个类的所有对象都有相同的数据结构,并且共享相同的实现操作的代码,而各个对象有着各自不同的状态,即私有的存储。

因此,类是所有对象的共同的行为和不同状态的集合体。

3.继承

类提供了说明一组对象结构的机制,再借助于继承扩充类的定义方式,从而体现代码可重用的优越性。

继承提供了创建新类的一种方法,这种方法就是说,一个新类可以通过对已有类进行修改或扩充来满足新类的要求。

新类共享已有类的行为,而自己还具有修改的或额外添加的行为。

因此,可以说继承的本质特征是行为共享。

从一个类继承定义的新类将继承已有类的所有方法和属性,并且还可以添加所需要的新的方法和属性。

新类被称为已有类的子类,而已有类称为父类,又叫基类,新类又叫派生类。

注意:

面向对象的3个要素是对象、类和继承。

在C++中,类是主要的编程对象,程序员需要设计类的成员变量和成员函数,以及类与外界的接口。

对象即类的实例化,类是对象的模板。

同一个类的对象具有相同的行为,但状态可以不同。

继承是创建新类的一种重要方法,派生类按照继承类型的不同可以从基类继承到不同的成员,同时派生类还可以添加新的成员,通过这种继承和扩充得到新的类。

1.2.3面向对象的技术

面向对象程序设计的本质是把数据和处理数据的过程当成一个整体——对象。

面向对象程序设计的实现需要封装和数据隐藏技术,以及继承和多态性技术。

1.封装和数据隐藏

当一个技术员要安装一台电脑时,他将各个设备组装起来。

当他想要—个声卡时,不需要用原始的集成电路芯片和材料去制作一个声卡,而是来到电脑公司,购买一个他所需要的某种功能的声卡。

技术员关心的是声卡的功能,并不关心声卡内部的工作原理。

声卡是自成一体的,这种自成一体性称为封装性。

无须知道封装单元内部如何工作就能使用的思想称为数据隐藏。

声卡的所有属性都封装在声卡中,不会扩展到声卡之外。

因为声卡的数据隐藏在该电路板上。

技术员无须知道声卡的工作原理就能有效地使用它。

C++通过建立用户定义类型(类)支持封装性和数据隐藏。

完好定义的类一旦建立,就可看作是完全封装的实体,可以作为一个整体单元使用。

类的实际内部工作应当隐藏起来,程序员在使用完好定义的类时不需要知道类是如何工作的,只要知道如何使用它就可以了。

2.继承和重用

要制造新的电视机,可以有两种选择:

一种是从草图开始制造一个全新的电视机,另一种是对现有的型号加以改进。

也许现有的型号已经令人满意,但如果再加一些功能,会更加完美。

电视机工程师肯定不想从头开始,而是希望制造另一种新型电视机,该机是在原有型号的基础上增加一组电路做成的。

新的电视机很快就制造出来了,被赋予一种新的型号,于是新型电视机就诞生了。

这是继承和重用的实例。

C++采用继承支持重用的思想,程序可以在扩展现有类型的基础上声明新类型。

新子类是从现有类型派生出来的,称为派生类。

新型电视机只是在原有型号的电视机上增加若干种功能而得到的,所以新型电视机是原有电视机的派生,它继承了原有电视机的所有属性,并在此基础上增加了新的功能。

3.多态性

通过继承的方法构造类,采用多态性为每个类指定表现行为。

例如,学生类应该有一个计算成绩的操作,小学生、中学生和大学生都继承自学生类。

显然对于各种不同的学生类型需要统计的课程不一样,这就需要计算成绩的操作在不同的学生类中有不同的实现,但使用同一个操作名称。

继承和多态的结合可以轻易构造一系列功能类似但又各异的类和对象。

由于继承性,这些类和对象具有相似的特征。

但由于多态性,同样一种行为在不同类和对象上又有不同的实现和结果。

1.2.4C++对面向对象的支持

1.C++支持数据封装

支持数据封装就是支持数据抽象。

在C++中,类是支持数据封装的工具,对象则是数据封装的实现。

面向过程的程序设计方法与面向对象的程序设计方法在对待数据和函数关系上是不同的。

在面向过程的程序设计中,数据只被看成是一种静态的结构,它只有等待调用函数来对它进行处理。

在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。

另外,封装还提供一种对数据访问严格控制的机制。

因此,数据将被隐藏在封装体中,该封装体通过操作接口与外界交换信息。

对象被说明为具有一个给定类的变量。

每个给定类的对象包含有这个类所规定的若干个私有成员和公有成员以及保护成员。

在C语言中可以定义结构,但这种结构只包含数据,而不包含函数。

C++中的类是数据和函数的封装体。

在C++中,结构可作为一种特殊的类,它虽然可以包含函数,但是它没有私有或保护的成员。

2.C++支持类

C++类中可定义三种不同访问控制权限的成员。

一种是私有(private)成员,只有在类中说明的函数才能访问该类的私有成员,而在该类之外的函数不可以访问私有成员;另一种是公有(public)成员,在类外面也可访问公有成员,成为该类的接口;还有一种是保护(protected)成员,这种成员只有该类的派生类可以访问,其余的在这个类外不能访问。

3.C++支持消息和对象

C++是通过向对象发送消息来处理对象的,每个对象根据所接收到的消息的性质来决定需要采取的行动,以响应这个消息。

因此,送到一个对象的所有可能的消息在对象的类描述中都需要定义,即对每个可能的消息给出一个相应的方法。

方法是在类定义中使用函数来定义的,使用一种类似于函数调用的机制把消息发送到一个对象上。

4.C++中允许友元破坏封装性

类中的私有成员一般是不允许该类外面的任何函数访问的,但是友元可打破这条禁令,它可以访问该类的私有成员(包含数据成员和成员函数)。

友元可以是在类外定义的函数,也可以是在类外定义的整个类,前者称友元函数,后者称为友元类。

友元打破了类的封装性,它是C++另一个面向对象的重要特征。

5.C++允许函数名和运算符重载

函数名重载和运算符重载都属于多态性,多态性是指相同的语言结构可以代表不同类型的实体或者对不同类型的实体进行操作。

C++支持多态性。

C++允许一个相同的标识符或运算符代表多个不同实现的函数,这称之为标识符或运算符的重载,用户可以根据需要定义标识符重载或运算符重载。

6.C++支持继承

C++中可以允许单继承和多继承,一个类可以根据需要生成派生类。

派生类继承了基类的所有方法,另外派生类自身还可以定义所需要的不包含在父类中的新方法。

一个子类的每个对象包含有从父类那里继承来的数据成员以及自己所特有的数据成员。

由于C++支持继承性,因此C++将具有继承所带来的好处。

7.C++支持动态联编

C++中可以定义虚函数,通过定义虚函数来支持动态联编。

动态联编是多态性的一个重要特征。

多态性形成由父类和它们的子类组成的一个树型结构。

在这个树中的每一个子类可接收一个或多个具有相同名字的消息。

当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。

以上概述了C++对面向对象程序设计中的一些主要特征的支持。

有关这些支持的实现将是后面章节中的主要内容。

1.3C++程序的结构

1.3.1C++语言的词法规则

1.标识符

标识符是由程序员所定义的单词,用它来命名程序中的一些实体,比如变量名、函数名、类名、语句标号等。

在C和C++中规定:

(1)由英文字母、数字和下划线组成,即a~z,A~Z,0~9。

(2)每个标识符必须以字母或下划线开始,例如nCount,n_system_time,_blank,9Days等都是合法的标识符,而$Salary,rate%,smith@tsinghua等都是不合法的标识符。

(3)标识符不能是系统的保留字。

(4)区分字母的大小写,例如nStudent,nstudent,NSTUDENT是不同的标识符。

(5)标识符长度不限,但在C语言中一般机器上只有前8个字符有效。

注意:

以上规则是必须要遵从的。

在命名标识符时,为便于阅读,一般的命名方法是:

类型名简写+实体名称,其中实体名称应是有意义的单词序列,各个单词用下划线连接,否则各单词的首字母应大写。

2.系统保留字

保留字是系统已经预定义的一些标识符,它们的意义和作用由系统规定。

下面是一些常用的保留字:

表1.1保留字及意义

保留字

意义

break

跳出循环体,结束循环

case

分支语句中的分支

char

字符型数据

class

定义类的关键字

const

常量

continue

跳出本次循环,进行下一次

续表

保留字

意义

default

分支语句中的默认分支

delete

释放指针指向的内存块

do

do型循环

double

双浮点型数据

else

判断语句中的否定分支

enum

定义枚举型数据

extern

声明外部变量

float

浮点型数据

for

for型循环

friend

友元

goto

跳转语句

if

判断语句

inline

声明为内联函数

int

整型数据

long

长整型数据

new

申请内存块

operator

定义运算符重载

private

私有成员;私有继承

protected

保护成员;保护继承

public

公有成员;公有继承

return

从函数中返回

short

短整型数据

signed

有符号型数据

sizeof

取数据类型长度运算符

static

静态数据

struct

定义结构体型数据

switch

分支语句

this

本类指针

typedef

重定义数据类型

union

定义联合体型数据

virtual

虚继承;虚函数

void

定义函数不返回数值

while

while型循环

上述保留字也都是关键字,用户不可以重新定义,只能按规定的意义使用。

3.分隔符

分隔符又称标点符号,它用来分隔标识符和语句,它表示某个程序元素的结束和另一个程序元素的开始。

在C++中常用的分隔符如下:

(1)空格符。

空格符是最常用的分隔符,用来作为标识符之间的分隔。

(2)分号。

分号有两个用途:

一是用在for循环语句括号中的三个表达式之间的分隔符;二是用于语句与语句之间的分隔。

注意在C和C++中,每条完整的语句之后必须有分号来标志语句结束,回车换行是不能作为分隔符的。

(3)逗号。

逗号有两个用途:

一是作为说明多个变量或对象类型时变量之间的分隔符;二是作为函数参数之间的分隔符。

另外,逗号还可用来作为运算符,这在以后介绍。

(4)冒号。

冒号有两个用途:

一是作为语句标号与语句之间的分隔符;二是在switch语句中,保留字case、default与语句之间的分隔。

4.续行

在C++中,每条语句以分号结束,一条语句可以独占一行,一行上可以写多条语句。

但对于过长的语句可以用续行符将语句分成多行。

续行符是“\”,它只能用在一行的末尾,并且要与该行最后一个字符之间空一格。

例如:

nCount=(nMathScore*nMathCredit+\

nEnglisthScore*nEnglishCredit+\

nChineseScore*nChineseCredit)/\

(nMathCredit+nEnglishCredit+nChineseCredit);

注意函数的参数可以分多行写,不需要续行符,例如:

CalculateGPA(nMathScore,nMathCredit,

nEnglishScore,nEnglishCredit,

nChineseScore,nChineseCredit);

但是各个参数的名称不能被打断,否则也应该用续行符。

5.注释

注释在程序中仅起到对程序进行注释和说明的作用,目的是使得程序便于阅读。

在源程序被编译时,所有的注释都会被忽略。

在C语言中,注释只有一种形式:

用“/*”和“*/”将注释部分括起来,这种注释方式中的注释部分可以是单行或多行。

在C++中,还有一种注释方式,以“//”开始,其后的部分被认为是注释,这种方式只能注释一行。

例如:

/*Thisisademonstrationformultilinecomments.

Andthisisthesecondcommentline.

Thisisthethird.*/

//Thisisasinglelinecomment

a=b+c;//thisisalsoacommentline.

两种注释方式可以根据情况选用,增强了程序的灵活性。

初学者应养成给程序添加注释的好习惯,这样可以给调试和以后的维护带来很大方便。

另外,在编写程序过程中,对于暂时不用的程序段可以用多行注释方式将其屏蔽,需要时再去掉注释,这样可避免误删除有用的代码。

注意:

标识符命名规则和系统保留字。

1.3.2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1