1、12一、机器语言、汇编语言和高级语言一、机器语言、汇编语言和高级语言 计算机系统包括硬件与软件两部分。计算机系统包括硬件与软件两部分。 软件是维护计算机硬件系统进行多用途计算的各种程序软件是维护计算机硬件系统进行多用途计算的各种程序的总和。的总和。 硬件是计算机系统的躯干,软件是计算机系统的灵魂。硬件是计算机系统的躯干,软件是计算机系统的灵魂。 计算机语言是驾驭软件开发的一套语法规则,这套语法计算机语言是驾驭软件开发的一套语法规则,这套语法规则的具体实现又是通过称之为编译器的软件来完成的。规则的具体实现又是通过称之为编译器的软件来完成的。 因此硬件、软件与计算机语言的历史是交叉耦合地进化因此硬
2、件、软件与计算机语言的历史是交叉耦合地进化的过程。的过程。3计算机程序设计语言可以归为如下三类:计算机程序设计语言可以归为如下三类: a.机器语言机器语言:硬件系统可识别的的原始语言硬件系统可识别的的原始语言;开发软开发软件难度大、周期长件难度大、周期长;程序员记忆的困难。程序员记忆的困难。 b.汇编语言汇编语言:直接处理所有硬件直接处理所有硬件;是各种语言中最快是各种语言中最快又最有效的语言又最有效的语言;容易理解、记忆。容易理解、记忆。 c.高级语言高级语言:屏蔽低级语言硬件细节的语言屏蔽低级语言硬件细节的语言,一个模一个模块对应汇编语言中一系列整体运行的指令。块对应汇编语言中一系列整体运
3、行的指令。4FORTRANFORTRAN 77FORTRAN90BASICANSI-BASICQBASICVISUAL-BASICDELPHIPASCALALGOLALGOL68SIMULA67SMALLTALKC+JAVAC#BCPLBC 图图 各种语言的发展演化进程各种语言的发展演化进程 5二、二、C语言的历史与特点语言的历史与特点 C语言是从语言是从BCPL(Basic Combined Programming Language)语言和)语言和B语言演化而来语言演化而来;集汇编语言处理硬件细节集汇编语言处理硬件细节和高级语言模块化高效编程长处于一身和高级语言模块化高效编程长处于一身; 它
4、介于低级的汇编语言与高级的它介于低级的汇编语言与高级的FORTRAN语言之间语言之间; C语言既有面向系统如汇编语言一样直接访问硬件的快捷语言既有面向系统如汇编语言一样直接访问硬件的快捷功能,又同时具备高级语言面向用户、容易记忆、清晰灵活功能,又同时具备高级语言面向用户、容易记忆、清晰灵活的优点,可称之为高级的汇编语言。的优点,可称之为高级的汇编语言。 6三、从三、从C语言到语言到C+语言的进化语言的进化 首先首先C+是一个更好的是一个更好的C语言,是语言,是C的一个超集,的一个超集, C+保留了保留了C语言的优点同时也吸收其它面向对象编程语言的长语言的优点同时也吸收其它面向对象编程语言的长处
5、。处。Stroustroup博士早期博士早期(80年代初年代初)通过一个名为通过一个名为cfront的转换程序将的转换程序将C+源程序处理成源程序处理成C源程序,这保证转换后的源程序,这保证转换后的代码能在任意支持代码能在任意支持C的编译系统中运行。的编译系统中运行。 C+语言的主要特点表现在:语言的主要特点表现在: 一、一、是全面兼容是全面兼容C语言语言; 二、二、是支持面向对象的编程方法是支持面向对象的编程方法; C+是典型的混合编程语言是典型的混合编程语言. 7 C语言不简单语言不简单(C语法是简单的语法是简单的),C+语言本质上也不语言本质上也不更多复杂。更多复杂。 但但C+语言包容了
6、许多面向对象的语法和概念,提高了语言包容了许多面向对象的语法和概念,提高了该语言处理复杂问题的抽象层次;面向对象编程提供了进行该语言处理复杂问题的抽象层次;面向对象编程提供了进行驾驭大型软件开发的有力手段,对于程序的重用和可维护性驾驭大型软件开发的有力手段,对于程序的重用和可维护性提供了新的理论支持。提供了新的理论支持。 最关键的是解决问题,语言仅是一种手段。最关键的是解决问题,语言仅是一种手段。 C+语言至关重要的是它并不将面向对象编程的语法手语言至关重要的是它并不将面向对象编程的语法手段强制程序员使用,段强制程序员使用,C/C+程序员可以将程序员可以将C+视为一个视为一个C语语言的改良版本
7、,充分利用言的改良版本,充分利用C+语言子集的卓越性能进行游刃语言子集的卓越性能进行游刃有余的编程,进行面向问题的软件开发。积累了一定具体的有余的编程,进行面向问题的软件开发。积累了一定具体的经验之后再适当步入面向对象的动态世界。经验之后再适当步入面向对象的动态世界。8四、计算机结构的五个主要单元四、计算机结构的五个主要单元 软件的开发必须与计算机的体系结构打交道,与程序设软件的开发必须与计算机的体系结构打交道,与程序设计相关的计算机结构是下面的五个主要单元:计相关的计算机结构是下面的五个主要单元: 1. 输入单元:输入单元: 输入单元是计算机接受信息的部分并且与计算机完成信输入单元是计算机接
8、受信息的部分并且与计算机完成信息的交互。它从各种输入设备读取中断信息,同时把这些信息的交互。它从各种输入设备读取中断信息,同时把这些信息放置在其它处理信息的单元中。息放置在其它处理信息的单元中。 有两种常用的输入信息的设备,一个是键盘,另一个是有两种常用的输入信息的设备,一个是键盘,另一个是鼠标。标准输入鼠标。标准输入stdin常指设备键盘。常指设备键盘。 9 2. 输出单元输出单元: 输出单元是计算机输出信息的部分。输出单元是计算机输出信息的部分。 它将计算机处理的信息或数据送入各种输出设备中,从它将计算机处理的信息或数据送入各种输出设备中,从而这些信息能够有效的阅读。而这些信息能够有效的阅
9、读。 有两种常用的输出信息的设备,它们是屏幕显示器与打有两种常用的输出信息的设备,它们是屏幕显示器与打印机。印机。 标准输出标准输出stdout指显示器指显示器,标准打印标准打印stdprn指打印机。指打印机。10 3. 中央处理单元中央处理单元: 中央处理单元是计算机的核心硬件部分中央处理单元是计算机的核心硬件部分CPU,CPU本本身由算术逻辑部件、控制逻辑部件和一组工作寄存器构成。身由算术逻辑部件、控制逻辑部件和一组工作寄存器构成。 算术逻辑部件算术逻辑部件ALU用来进行算术逻辑运算,控制逻辑用来进行算术逻辑运算,控制逻辑部分负责对全机的管理,包括从存储器取出指令,对总线及部分负责对全机的
10、管理,包括从存储器取出指令,对总线及输入输出设备的数据转送控制等。输入输出设备的数据转送控制等。 寄存器是寄存器是CPU中的存储单元,用来存放算术逻辑部件中的存储单元,用来存放算术逻辑部件处理的中间结果,包括对存储器的寻址等。存储器是下面的处理的中间结果,包括对存储器的寻址等。存储器是下面的内存单元。内存单元。11 4. 内存单元内存单元: 内存单元由称之为内存条的硬件作为物理载体,是计算内存单元由称之为内存条的硬件作为物理载体,是计算机中存取速度快的存储信息的部分。机中存取速度快的存储信息的部分。 程序的数据与代码指令动态地保存在内存中,内存的记程序的数据与代码指令动态地保存在内存中,内存的
11、记忆性能是瞬态稳定的,关机则意味着内存信息的彻底消失,忆性能是瞬态稳定的,关机则意味着内存信息的彻底消失,内存信息必须永久性地保存到外存上。内存信息必须永久性地保存到外存上。 5. 外存单元外存单元: 外存单元是计算机用来长期保存数据信息的存储部分,外存单元是计算机用来长期保存数据信息的存储部分,与计算机软件相关的信息在关机状态都必须有效地存放在外与计算机软件相关的信息在关机状态都必须有效地存放在外存中。存中。 常见外存设备是软盘、硬盘、闪盘和光碟。常见外存设备是软盘、硬盘、闪盘和光碟。12五、五、C/C+程序的实现程序的实现 C/C+程序的实现是通过软件开发工具进行程序的实现是通过软件开发工
12、具进行的,目前流行的软件开发工具以的,目前流行的软件开发工具以Visual C+6.0 和和C+Build 5.0为代表。本书程序利用为代表。本书程序利用VisualC+6.0进行开发进行开发,其本身是优秀的可视化编程开发工具。其本身是优秀的可视化编程开发工具。 Visual C+6.0开发的程序只能是开发的程序只能是32位应用程位应用程序,即内存地址的寻址方式为序,即内存地址的寻址方式为32寻址。寻址。 所有语言源程序的实现都必须经历下面四个所有语言源程序的实现都必须经历下面四个步骤:步骤: 1.编辑编辑 2.翻译翻译3.连接连接4.运行运行13 1.编辑编辑: 编辑是根据计算机语言的语法规
13、则将算法与相应的数编辑是根据计算机语言的语法规则将算法与相应的数据输入到计算机中形成含原始代码的文本文件的过程。据输入到计算机中形成含原始代码的文本文件的过程。 这一文本文件或源文件对于这一文本文件或源文件对于C编程方式以扩展名即编程方式以扩展名即 .c的的文件保存文件保存,C+编程方式以扩展名即编程方式以扩展名即 .cpp的磁盘文件保存。的磁盘文件保存。 通常通常C+源程序的文件为两部分:接口文件(也称为头源程序的文件为两部分:接口文件(也称为头文件)和实现文件文件)和实现文件(或源文件或源文件),C+头文件的标准扩展名头文件的标准扩展名为为.h,C+实现文件的标准扩展名为实现文件的标准扩展
14、名为.cpp,系统最终将头文,系统最终将头文件插入到实现文件中即源文件件插入到实现文件中即源文件.cpp中。中。 文本是指由字母、数字、符号等组成的明白可读的字符文本是指由字母、数字、符号等组成的明白可读的字符信息,文本编译器可以用来建立、输入或修改文本。信息,文本编译器可以用来建立、输入或修改文本。14 2.翻译翻译: 高级语言的翻译程序有两种方式:一种是编译型的程高级语言的翻译程序有两种方式:一种是编译型的程序,另一种是解释型的程序。序,另一种是解释型的程序。 低级的汇编语言翻译程序对应一个汇编程序,汇编程序低级的汇编语言翻译程序对应一个汇编程序,汇编程序直接将汇编语言转换成机器语言,然后
15、加工处理成目标代直接将汇编语言转换成机器语言,然后加工处理成目标代码,转换的中间环节最少。码,转换的中间环节最少。 编译型的翻译方式为先把高级语言翻译成机器语言然后编译型的翻译方式为先把高级语言翻译成机器语言然后再将汇编语言翻译成机器语言。如再将汇编语言翻译成机器语言。如FORTRAN 、C 和和C+是是编译型的程序。编译型的程序。 解释型的翻译方式是直接把高级语言在机器上运行,一解释型的翻译方式是直接把高级语言在机器上运行,一边解释一边执行,如边解释一边执行,如BASIC 和和JAVA是解释型的程序。是解释型的程序。15 编译型方式的优点是运行效率快、执行时间短编译型方式的优点是运行效率快、
16、执行时间短; 解释型解释型 的长处是占用内存少。的长处是占用内存少。 3. 连接过程连接过程: 连接过程是由连接程序进行的。连接程序用来把编译连接过程是由连接程序进行的。连接程序用来把编译阶段分别编译产生的目标文件、系统原先提供的库文件或其阶段分别编译产生的目标文件、系统原先提供的库文件或其它中间列表信息文件或二进制资源文件等连接在一起,形成它中间列表信息文件或二进制资源文件等连接在一起,形成一个整体运行的扩展名为一个整体运行的扩展名为.exe的执行程序。的执行程序。 连接过程可以进一步发现在编译阶段未能捕获的错误,连接过程可以进一步发现在编译阶段未能捕获的错误,如某个函数模块的遗漏,标识符的
17、重复定义等。库文件有静如某个函数模块的遗漏,标识符的重复定义等。库文件有静态连接库和动态连接库,扩展名各自为态连接库和动态连接库,扩展名各自为.lib 和和.dll。16 4. 加载运行加载运行: 加载运行就是将执行程序从外存如硬盘或光碟中的机器加载运行就是将执行程序从外存如硬盘或光碟中的机器指令转送到内存储器,以便机器执行;程序在执行之前必须指令转送到内存储器,以便机器执行;程序在执行之前必须先装入内存,对于大的程序操作系统根据系统的内存资源可先装入内存,对于大的程序操作系统根据系统的内存资源可能只将高频使用的部分代码装入内存。能只将高频使用的部分代码装入内存。 预处理编译过程常称为编译时,
18、连接过程称为连接时,预处理编译过程常称为编译时,连接过程称为连接时,加载运行过程称为运行时。加载运行过程称为运行时。 常用编译器一词笼统地指编译、连接和运行三个过程,常用编译器一词笼统地指编译、连接和运行三个过程,因为集成开发环境对这三个过程可以通过一个命令一次连续因为集成开发环境对这三个过程可以通过一个命令一次连续的执行。的执行。17六、六、C/C+源程序的基本形式源程序的基本形式 程序设计语言有各自编写的形式。汇编语言具程序设计语言有各自编写的形式。汇编语言具有指令加左操作数和右操作数的形式,表现了该语有指令加左操作数和右操作数的形式,表现了该语言与机器语言的直接贴近。言与机器语言的直接贴
19、近。 C/C+源程序书写格式非常灵活,一条语句可源程序书写格式非常灵活,一条语句可以分散在不同的行上也可以将许多语句压缩在单行以分散在不同的行上也可以将许多语句压缩在单行上。上。18例例程序的分散表示。程序输出:程序的分散表示。程序输出:Nothing is hard in the world #include void main (void /* 圆括号中的圆括号中的void明确表示无入口参数明确表示无入口参数*/) /*printf(/*世上无难事世上无难事*/t);*/ printf (Nothing is hard in the worldn); /end Nothing is har
20、d in the worldn合并为合并为Nothing is hard in the worldn ,程序输出双引号内的字符串,程序输出双引号内的字符串, printf 是输出库函数。是输出库函数。 按回车键按回车键在源程序产生看不见的字符,简称换行符或在源程序产生看不见的字符,简称换行符或硬回车,硬回车,“ n”是换行符的转义序列,表示在屏幕上产生一是换行符的转义序列,表示在屏幕上产生一个个回车换行动作。回车换行动作。19例例程序的压缩表示。程序的压缩表示。 #include void main ( void ) /*printf(世上无难事世上无难事t);*/ printf (Nothi
21、ng is hard in the worldn); /end去掉斜杠星号去掉斜杠星号/*-*/对,可以得到一个改进的程序。对,可以得到一个改进的程序。程序依然输出结果:程序依然输出结果: Nothing is hard in the world20例例程序改动一些注释。输出:程序改动一些注释。输出: /*世上无难事世上无难事*/ Nothing is hard in the world #include void main ( ) printf ( /*世上无难事世上无难事*/t); / t是水平制表的转义序列,表示水平跳过是水平制表的转义序列,表示水平跳过8个空格个空格 printf (N
22、othing is hard in the worldn); 从上面三个例子可以看出从上面三个例子可以看出C/C+程序外在格式的灵活程序外在格式的灵活性,有展开的可读性强的形式,也有浓缩的节省纸张的形性,有展开的可读性强的形式,也有浓缩的节省纸张的形式,可用回车键、空格键和删除键在扩伸与压缩之间变换。式,可用回车键、空格键和删除键在扩伸与压缩之间变换。21 一个空格可以扩展为多个空格,多个空格可以浓缩为一个空格可以扩展为多个空格,多个空格可以浓缩为一个空格。一个空格。 一条语句可分散在多行上,一行可以写多个语句,语一条语句可分散在多行上,一行可以写多个语句,语句由分号结束。但空格或空行的增删不
23、是任意的。句由分号结束。但空格或空行的增删不是任意的。 变量名函数名关键字如变量名函数名关键字如if, int 等名称之间、带参的宏名等名称之间、带参的宏名与圆括号之间、续行符与圆括号之间、续行符之间、转义序列如之间、转义序列如n之间、运算符之间、运算符如如+,+=之间不能插入空格。之间不能插入空格。 字符串中的空格和换行符视为有效字符。作为名称或运字符串中的空格和换行符视为有效字符。作为名称或运算符之间分隔的空格是不能删除的。算符之间分隔的空格是不能删除的。例如:例如: x+ +y不同于不同于x+ +y #define x3 不同于不同于#define x 3 除此之外的空格和空行一般是可以
24、任意设置的。除此之外的空格和空行一般是可以任意设置的。22C/C+的程序内在的格式由如下几个方面构成:的程序内在的格式由如下几个方面构成: 1. #include预处理指令引入的头文件预处理指令引入的头文件 2. main()函数表示的函数表示的dos或或console模式下应模式下应 程序的入口程序的入口 3. 花括号对花括号对“ ”表示程序的结构层次范围表示程序的结构层次范围 4. 分号分号“;”结束的表达式语句或函数调用语句结束的表达式语句或函数调用语句 5. 多行注释多行注释/*-*/或单行注释或单行注释/- 23 由井字号由井字号“#”引入的指令为预处理指令,对应的预处理引入的指令为
25、预处理指令,对应的预处理语句不以分号语句不以分号“;”结尾,结尾,“#include”称为文件包含预处理称为文件包含预处理指指令,通过该指令系统将其后程序段使用的名称进行了预先的令,通过该指令系统将其后程序段使用的名称进行了预先的说明。说明。 #include 的作用是将的作用是将stdio.h文件在预处理阶文件在预处理阶段插入到程序段插入到程序.cpp中,作为程序源文件的一个有机部分。中,作为程序源文件的一个有机部分。 “#include”指令是代码重用的有效手段。指令是代码重用的有效手段。stdio.h是标是标准准输入输出头文件,其中包含了输入输出头文件,其中包含了printf, scan
26、f函数的原型说函数的原型说明。明。 printf 函数和函数和scanf 函数是函数是C运行库函数。运行库函数。24 当编译器编译某条当编译器编译某条 printf 语句时,编译器根据语句时,编译器根据#include可以知道可以知道 printf 是一个函数名,这样在是一个函数名,这样在目标程序里为该例程建立一个入口,但编译器并不知道库函目标程序里为该例程建立一个入口,但编译器并不知道库函数在哪里。数在哪里。 连接程序会扫描库函数并在目标程序中插入对这些库函连接程序会扫描库函数并在目标程序中插入对这些库函数的正确调用。数的正确调用。 如果在相应的子目录中没有扫描到由函数名如果在相应的子目录中
27、没有扫描到由函数名 printf 指指示的库函数,则连接程序会提示一个错误。示的库函数,则连接程序会提示一个错误。25 main()是文本编程模式下的入口函数,是文本编程模式下的入口函数,Windows API编程模式下的入口函数为编程模式下的入口函数为 WinMain,main函数的前面函数的前面void表示该函数没有返回值,圆括号表示该函数没有返回值,圆括号“()”中的中的void表示系统不从表示系统不从环境中读取输入值。环境中读取输入值。 main函数或其它函数必须存在匹配的花括号对函数或其它函数必须存在匹配的花括号对 。匹配按就近原则进行,右花括号匹配按就近原则进行,右花括号 向前或向
28、上或向右匹配向前或向上或向右匹配距离最近的左花括号距离最近的左花括号 。 花括号对花括号对. 之间是若干条语句。配对的花括号与其之间是若干条语句。配对的花括号与其间的语句一起可视为一条语句,称为程序块。间的语句一起可视为一条语句,称为程序块。 最外层的左花括号最外层的左花括号 标志函数体的开始,相应的右花标志函数体的开始,相应的右花括号括号是该函数的结束,其后不再跟分号是该函数的结束,其后不再跟分号;。 26 C/C+程序最重要的一个语法现象就是分号程序最重要的一个语法现象就是分号“;”,一个,一个单独的分号单独的分号“;”本身就是一个语句,语句是构成程序的基本本身就是一个语句,语句是构成程序
29、的基本单元。单元。 大量的语句由表达式加上分号构成,称为表达式语句。大量的语句由表达式加上分号构成,称为表达式语句。 其它语句如选择语句、控制语句等大都与分号发生联其它语句如选择语句、控制语句等大都与分号发生联系,分号是语句的必要成分又是语句与语句之间的分隔标系,分号是语句的必要成分又是语句与语句之间的分隔标志。编译器通过扫描分号对复杂的流程进行断句处理。志。编译器通过扫描分号对复杂的流程进行断句处理。 前面例子中的语句:前面例子中的语句: printf ( Nothing is hard in the worldn ); 该语句由两部分组成,一是函数调用,另一个是分号该语句由两部分组成,一是
30、函数调用,另一个是分号; 。称为函数调用语句,指示计算机执行相应的动作,。称为函数调用语句,指示计算机执行相应的动作,即将双引号括起来的字符串打印到屏幕上。即将双引号括起来的字符串打印到屏幕上。27C+程序中注释有两种形式:程序中注释有两种形式: 多行注释即斜杠星形式多行注释即斜杠星形式/*.*/和和C+语言新引进的语言新引进的单行注释单行注释/. 形式。形式。 C+在预处理阶段就将注释所含盖的字符化为空白。在预处理阶段就将注释所含盖的字符化为空白。 多行注释即斜杠星形式多行注释即斜杠星形式/*.*/忽略始于忽略始于/*之后所有文之后所有文本内容,直到发现本内容,直到发现*/为止。为止。/*向
31、后或向下匹配距离其最近向后或向下匹配距离其最近的的*/,其间的内容包括定界符,其间的内容包括定界符/*.*/本身被处理为空白。本身被处理为空白。 /*.*/形式的注释不嵌套使用,注释字符形式的注释不嵌套使用,注释字符/*-*/和和 /在字符串或注释内部没有任何特殊意义。在字符串或注释内部没有任何特殊意义。 注释不应插在标识符或名称的中间,以避免一个名称被注释不应插在标识符或名称的中间,以避免一个名称被分隔为两个标识符。分隔为两个标识符。a.28 单行注释单行注释“/-”形式忽略其后的内容直到本行结形式忽略其后的内容直到本行结束,即包括双斜杠在内的其后的文本被处理为空白。束,即包括双斜杠在内的其
32、后的文本被处理为空白。 如下如下的注释为两个不同的单行注释:的注释为两个不同的单行注释:/* 语句序列语句序列; /*/对语句序列不起作用即程序保留语句序列的执行功能。对语句序列不起作用即程序保留语句序列的执行功能。 如下的注释属于单独的多行注释:如下的注释属于单独的多行注释:/* 语句序列语句序列; /*/b.29 通过增删上面的斜杠通过增删上面的斜杠/可以对其间选定的程序段起到去可以对其间选定的程序段起到去留的切换作用。留的切换作用。 斜杠星形式斜杠星形式/*-*/斜杠与星号必须紧贴在一起才起斜杠与星号必须紧贴在一起才起作用,利用这一性质可以灵活控制程序段的去留。作用,利用这一性质可以灵活
33、控制程序段的去留。 注释是编译器不予保留的文本,是关于软件代码的细节注释是编译器不予保留的文本,是关于软件代码的细节说明。说明。 注释不是必须的编程部分,对于程序的运行没有丝毫的注释不是必须的编程部分,对于程序的运行没有丝毫的关系。关系。30七、函数初步七、函数初步 C/C+程序通过函数运转,函数操作数据和变量。程序通过函数运转,函数操作数据和变量。 程序根据源代码出现的先后次序一个一个语句地顺序往程序根据源代码出现的先后次序一个一个语句地顺序往后执行,称为顺序流程结构。后执行,称为顺序流程结构。 遇到函数调用则流程转入被调用的函数体,然后从被调遇到函数调用则流程转入被调用的函数体,然后从被调
34、函数返回,执行函数调用的下一条语句。函数返回,执行函数调用的下一条语句。 在编辑输入上面的代码时请注意在编辑输入上面的代码时请注意: 新的集成开发环境支新的集成开发环境支持汉字出现在字符串中,但汉字环境的标点符号与英文环境持汉字出现在字符串中,但汉字环境的标点符号与英文环境的标点符号其编码是不一样的,因此在字符串之外的标点符的标点符号其编码是不一样的,因此在字符串之外的标点符号一定要保证在英文环境中输入,否则导致源代码的语法错号一定要保证在英文环境中输入,否则导致源代码的语法错误。误。 31例例 C流文件及函数调用实现顺序流程流文件及函数调用实现顺序流程 #include /void型函数型函
35、数vf的定义,放置于主控函数前的定义,放置于主控函数前 void vf (int x, int y, int s) / void表示函数没有返回值,形参表示函数没有返回值,形参x,y,z是是int型的变量型的变量 printf (%d, %dn, x+y, s); /花括号包含的语句表示函数体花括号包含的语句表示函数体 int Add (int ,int ); /Add函数原型说明函数原型说明,表示入口形参为表示入口形参为2个个int型数据型数据,返回返回int型数据型数据 void Show()/圆括号中一无所有表示入口无参圆括号中一无所有表示入口无参,void Show()相当于相当于 v
36、oid Show (void) printf (输入两个整数输入两个整数t); 32 int main (void) /圆括号中的圆括号中的void表示表示main函数此时没有入口参数,返回函数此时没有入口参数,返回int型数据型数据 int i, j, sum; /*变量定义语句变量定义语句*/ Show () ; /*提示输入两个整数提示输入两个整数*/ scanf (%d, %d, &i, &j); /*读入整数分别给变量读入整数分别给变量j,k*/ sum = Add (i, j); /*函数调用求和函数调用求和*/ printf (Sum is %dt, sum); /*屏幕上显示出
37、和屏幕上显示出和*/ vf (i, j, Add (i, j); /vf(i,j,Add(i,j)等价于等价于vf (i, j, sum); return 1; /*返回信息给操作系统是好的编程风格返回信息给操作系统是好的编程风格*/33 int Add (int l, int m) /*定义定义Add函数函数,函数的返回类型为整型函数的返回类型为整型*/ /*入口参数入口参数 l,m是整型是整型*/ return l+m ; /*直接返回直接返回l,m数的和数的和*/ / 函数调用函数调用Add(i,j)根据返回类型确定为根据返回类型确定为int型的表达式型的表达式执行程序得到:执行程序得到
38、:输入两个整数输入两个整数 5,6Sum is 11 11,11 34 在编辑输入上面的代码时请注意,新的集成开发环境支在编辑输入上面的代码时请注意,新的集成开发环境支持汉字出现在字符串中,但汉字环境的标点符号与英文环境持汉字出现在字符串中,但汉字环境的标点符号与英文环境的标点符号其编码是不一样的,因此的标点符号其编码是不一样的,因此在字符串之外的标点符在字符串之外的标点符号一定要保证在英文环境中输入,否则导致源代码的语法错号一定要保证在英文环境中输入,否则导致源代码的语法错误。误。 本程序包括用户定义的函数:主函数本程序包括用户定义的函数:主函数main()和普通的函和普通的函数数Add以及
39、以及vf。另外借用了系统提供的库函数。另外借用了系统提供的库函数。 在在stdio.h给出了标准输入函数给出了标准输入函数scanf标准输出函数标准输出函数printf的原型说明。的原型说明。 Add函数的作用是求两个整型变量的和,函数的作用是求两个整型变量的和,return关键字关键字所引出的语句将整型变量所引出的语句将整型变量l和和m的和返回给主函数的和返回给主函数main,返,返回值是通过函数调用的方式进行的。回值是通过函数调用的方式进行的。35程序主要包括如下程序主要包括如下6个步骤:个步骤: 1. 变量的定义变量的定义 2. 变量的初始化过程变量的初始化过程 3. 用户与计算机实时交
40、互用户与计算机实时交互 4. 算法的模块化处理函数算法的模块化处理函数 5. 函数调用的虚实结合匹配函数调用的虚实结合匹配 6. 控制权的带信息返回控制权的带信息返回 36 C/C+程序设计中变量必须明显地定义才能使用,这程序设计中变量必须明显地定义才能使用,这一点区别于一点区别于FORTRAN语言存在变量的隐含说明。语言存在变量的隐含说明。 语句语句int i, j, sum; 称为变量定义语句,称为变量定义语句,int是系统保是系统保留的关键字,留的关键字,i, j, sum则是用户引入的变量,变量定义语则是用户引入的变量,变量定义语句通知编译器为这些变量分配内存空间。句通知编译器为这些变
41、量分配内存空间。 对引入的变量赋予初值,称为变量的初始化。变量初始对引入的变量赋予初值,称为变量的初始化。变量初始化的位置和时刻是灵活的,变量的初始值可以位于本程序段化的位置和时刻是灵活的,变量的初始值可以位于本程序段内、硬盘上或动态交互输入。内、硬盘上或动态交互输入。 函数调用的虚实结合匹配是指函数定义部分的形参与函函数调用的虚实结合匹配是指函数定义部分的形参与函数调用时的实参一对一的呼应和结合过程,这一过程涉及到数调用时的实参一对一的呼应和结合过程,这一过程涉及到语言隐含的函数调用机制。语言隐含的函数调用机制。37 C语言中的函数调用机制为变量的数值传递,因此虚实语言中的函数调用机制为变量
42、的数值传递,因此虚实结合匹配的时候采用了一个中转站这就是变量的地址。结合匹配的时候采用了一个中转站这就是变量的地址。 通过中转站间接的完成被调函数对变量的赋值或改变。通过中转站间接的完成被调函数对变量的赋值或改变。 输入语句输入语句scanf (%d, %d, &i, &j); 在屏幕上读变量在屏幕上读变量i和和j的值,变量的值,变量i和和j之前分别加上了取地址运算符之前分别加上了取地址运算符&。 而输出语句而输出语句printf (Sum is %dn, sum); 的变量的变量sum前则没有取地址运算符前则没有取地址运算符&。 %d, %d是输入输出的格式化字符串,用来指示输入是输入输出的
43、格式化字符串,用来指示输入输出的数据类型和格式转换,输出的数据类型和格式转换,%d表示十进制整数类型,表示十进制整数类型, 有了这种格式化转换函数,系统就把内存中的二进制数有了这种格式化转换函数,系统就把内存中的二进制数据转换成用户可理解的数据类型。据转换成用户可理解的数据类型。 38 函数是重要的编程手段,其中包括三个相关的函数是重要的编程手段,其中包括三个相关的步骤:步骤: 1. 函数具体定义函数具体定义 int Add (int l, int m) return l+m; /l, m是形参,是形参, 2. 函数原型说明函数原型说明 int Add (int l, int m); /形参的
44、初始值在虚实结合时得到形参的初始值在虚实结合时得到 3. 函数调用虚实结合匹配函数调用虚实结合匹配 sum = Add (i, j); /i, j是匹配形参是匹配形参l, m的实参的实参39 函数定义对应函数的某种执行动作,函数定义由标题头函数定义对应函数的某种执行动作,函数定义由标题头和函数体构成,标题头由返回类型、函数名和形参列表构和函数体构成,标题头由返回类型、函数名和形参列表构成。成。例如:例如: int Add (int l, int m)是标题头是标题头,return l+m; 是函数体是函数体 函数原型表明函数的接口要求,虚实结合匹配在函数调函数原型表明函数的接口要求,虚实结合匹
45、配在函数调用点进行,函数调用时将实参用点进行,函数调用时将实参i, j 的值赋值给相应形参的值赋值给相应形参l, m;相当于相当于l=i, m=j。 函数的返回类型函数的返回类型int与与return中的表达式匹配。中的表达式匹配。 一般地,一般地,C/C+程序是通过变量和函数来组织的。变量程序是通过变量和函数来组织的。变量用于识别内存的数据,函数则对这些数据进行操作和转换处用于识别内存的数据,函数则对这些数据进行操作和转换处理。理。40 文本编辑器文本编辑器 编译器编译器源文件源文件1.cpp头文件头文件2.h头文件头文件1.h源文件源文件2.cpp 连接器连接器 库文件库文件.lib其它目
46、标文件其它目标文件.obj目标文件目标文件1.obj目标文件目标文件2.obj编译错编译错 执行程序执行程序.exe连接错连接错 预处理器预处理器运行错运行错 成功成功! 修改当前修改当前的源文件错的源文件错误误解决各文件解决各文件名称唯一性名称唯一性或遗漏或遗漏排除逻辑错排除逻辑错误或越界、误或越界、内存冲突等内存冲突等图图 C/C+程序的开发过程程序的开发过程 41 一般地,一般地,C/C+程序是通过变量和函数来组织的。变程序是通过变量和函数来组织的。变量用于识别内存的数据,函数则对这些数据进行操作和转换量用于识别内存的数据,函数则对这些数据进行操作和转换处理。函数根据返回类型是否有值分两
47、类,其定义格式分两处理。函数根据返回类型是否有值分两类,其定义格式分两种:种: 1. 不返回值的函数,称为不返回值的函数,称为void型的函数型的函数 void vf (类型类型1 形参形参1,类型类型2 形参形参2,.,类型类型n 形参形参n) 语句序列;语句序列; return; /函数体函数体 例:例: void vf (int x, int y, int s) printf (%d, %dn, x+y, s); 42 2. 返回确定类型值的函数返回确定类型值的函数 type f (T1 v1, T2 v2 ,., Tn vn) /*返回类型返回类型 函数名函数名(形参列表形参列表)*/
48、 语句序列;语句序列; return expre; 例:例: int Add (int l, int m) int z=l + m; return z; type表函数的返回类型表函数的返回类型,T1,T2,Tn表示形参的类型名,表示形参的类型名,它们可以是它们可以是int,double 以及结构名等以及结构名等; f, vf, Add是函数名。是函数名。43 返回类型返回类型 函数名函数名(形参列表形参列表) 称为函数定义的标题称为函数定义的标题头,标题头圆括号中形参类型后的参数头,标题头圆括号中形参类型后的参数 v1,v2,.,vn为形式为形式参数,简称形参。参数,简称形参。 类型名、函数
49、名和形参名遵循标识符的命名约定。将标类型名、函数名和形参名遵循标识符的命名约定。将标题头拷贝过来,末尾添一个分号得到函数原型,其中的形参题头拷贝过来,末尾添一个分号得到函数原型,其中的形参v1,v2,.,vn可省略,格式为可省略,格式为(左边为抽象的原型描述,右边左边为抽象的原型描述,右边为具体的举例为具体的举例): type f (T1 v1,T2 v2 ,.,Tn vn); int Add (int , int); 函数的标题头和函数体构成函数定义,紧接着右圆括函数的标题头和函数体构成函数定义,紧接着右圆括号号”)”的最外层花括号的最外层花括号包含的部分为函数体。包含的部分为函数体。 函数
50、体由若干语句构成,也可以根本没有语句,此时函数体由若干语句构成,也可以根本没有语句,此时称为空函数。称为空函数。44 函数定义时标题头的形参可以省略而仅有类型,此时表函数定义时标题头的形参可以省略而仅有类型,此时表示函数简单的提供一个接口准备。示函数简单的提供一个接口准备。 也可以根本没有入口参数。也可以根本没有入口参数。例如:例如: void Show () printf ( 输入两个整数输入两个整数t); 。 expre是可以转换为是可以转换为 type类型的表达式。类型的表达式。type如果是如果是int,则函数运算的结果返回,则函数运算的结果返回int型整数。型整数。 形参是入口,可以