




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1章Visual C+ 6.0开发环境,1.1开发环境概述 1.2开发环境的菜单功能 1.3开发环境的工具栏 1.4项目和项目工作区 1.5资源 1.6一个控制台应用程序 1.7程序调试 上机训练,1.1开发环境概述,界面由标题栏、菜单栏、工具栏、项目工作区窗口、文档窗口、输出窗口以及状态栏等组成,如图,1.3开发环境的工具栏,1.3.1工具栏概述 标准工具栏,1.3开发环境的工具栏,类向导工具栏 小型编连工具栏,1.4项目和项目工作区,还有相应的Debug或Release、Res等子文件夹。若创建的单文档应用程序项目名是Ex_Sdi,则各文件的布局如图。 VC应用程序向导创建项目时,系统会
2、自动为项目创建Win32 Debug的运行程序,并使用相应的缺省配置。和Win32 Release版本的区别在于:Debug版本的运行程序有相应的调试信息码,Release版本的运行程序没有,但Release版本的运行程序经过代码的优化,其程序的运行速度被最大加速。 注意:在开发环境中,VC是通过左边的项目工作区窗口来对项目进行各种管理。项目工作区窗口包含三个页面,是ClassView页、ResourceView页和FileView页,1.4项目和项目工作区,1.4.2 ClassView 用以显示项目中的所有的类信息。假设打开的项目名为Ex_Sdi,单击项目区窗口底部的ClassView,则
3、显示出“Ex_Sdi classes”的树状结点,在它的前面是一个图标和一个套在方框中的符号“+”,单击符号“+”或双击图标,Ex_Sdi中的所有类名将被显示,如CMainFrame、CEx_SdiApp、CEx_SdiDoc、CEx_SdiView等(如图所示,1.4项目和项目工作区,1.4.3ResourceView 包含了项目中所有资源的层次列表。每一种资源都有自己使用的图标。 1.4.4FileView FileView可将项目中的所有文件分类显示,如图。 每一类文件在FileView页面中都有自己的目录项(节点)。可以在目录项中移动文件,还可以创建新的目录项以及将一些特殊类型的文件放
4、在该目录项中。 创建一个新目录项,可在添加目录项的地方右击,选择“New Folder”,如图,输入目录项名称和相关的文件扩展名,单击OK,图1.22 “New Folder”对话框,1.5资源,1.5.1资源与资源标识 资源的分类 (1)快捷键列表 (2)工具栏按钮 (3)鼠标指针 (4)对话框 (5)HTML (6)图标 (7)菜单 (8)字符串列表 (9)版本信息 标识符 标识符的命名规则: (1) 在标识符名称中允许使用字母az、AZ、09以及下划线。 (2) 标识符名称不区分大小写字母。 (3) 不能以数字开头,如8BIT是不合法的标识符名。 (4) 字符个数不得超过247个,1.5
5、资源,1.5.2资源基本操作 创建资源 (1)从“Insert”菜单选取“Resource”;或用快捷键Ctrl+R打开对话框,如图。New用来创建一个由Resource Type列表中指定类型的新资源,Custom按钮用来创建Resource Type列表中没有的新类型的资源,Import按钮用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中。 (2)从Resource Type列表中选择一种资源类型,而后按New按钮。 (3) 在项目工作区窗口的ResourceView页面中,看到了刚才选中的资源的缺省标识符,而且相应的资源编辑器自动打开,图1.23 “Insert Re
6、source”对话框,1.5资源,打开资源 如果需要对已有资源进行查看或修改,可以首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,双击鼠标左键或者按Enter键,这时相应的资源编辑器也会相应自动打开。 删除、复制资源 如果删除一个已有的资源,可以首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,按Del键或者利用Edit菜单下的Delete菜单项可实现删除。复制资源的过程与删除类似,选中要打开的资源,按住Ctrl键不放,并拖动鼠标左键或利用Edit菜单中的Copy和Paste菜单命令进行操作,它同其他软件的复制过程相同。 保存资源
7、当设计或修改好一个资源后,用File菜单的Save菜单命令或利用快捷键Ctrl+S将其保存在当前资源文件中,1.5资源,1.5.3资源文件的管理 资源文件一经创建,其中所包含的资源也就随之而定,与资源相对应的标识符也被保存在Resource.h头文件中。 一般,在一个资源文件.RC中所保存的所有资源已经满足的需要了,尽管如此,VC仍然允许用多个文件来存放资源。用View菜单中的Resource Includes菜单命令打开“Resource Includes”对话框(如图1.24所示)时,可以看到Compile-time directives编辑框中已经含有#include resEx_Sdi
8、.rc2。 1.5.4资源编辑器 所有Windows资源都可以用VC提供的资源编辑器来编辑,图1.24 “Resource Includes”对话框,1.6一个控制台应用程序,1.6.1用AppWizard创建 用AppWizard创建一个控制台应用程序可按下列步骤进行: (1)选择“File”“New”菜单命令,显示出“New”对话框。 (2)选择Projects标签,选中Win32 Console Application项。 (3) 在Project Name框中键入控制台应用程序项目名称。第一次使用时最好确定该项目所在的文件夹以便于源文件的管理,既可在Location下的编辑框中直接键入
9、文件夹名称,也可单击Browse按钮择一个已有的文件夹,如图,图1.25 在“New”对话框中建立Ex_Hello控制台应用程序,1.6一个控制台应用程序,4) 单击OK。如图。选中A simple application项。 (5) 单击Finish,如图,单击OK按钮系统将自动创建此应用程序,1.6一个控制台应用程序,1.6.2理解程序框架 在项目工作区窗口中只能看到ClassView和FileView标签,如图。切换到FileView页面,可以看到AppWizard为生成了Ex_Hello.cpp、Stdafx.cpp、Stdafx.h以及ReadMe.txt四个文件。 Stdafx.c
10、pp是一个只有一条语句的空文件,Stdafx.h是VC为每个项目配置的用来预编译的文件;ReadMe.txt是VC为每个项目配置的说明文件,包括对AppWizard产生文件类型的说明以及操作的一些技巧;Ex_Hello.cpp是AppWizard产生的“真正”具有实际意义的程序源代码文件,几乎所有的代码都是添加在这个文件中的,图1.28 Ex_Hello项目工作区内容,1.6一个控制台应用程序,1.6.3添加程序代码 (1) 单击项目工作区窗口的ClassView标签项,将显示Ex_Hello类信息。 (2) 单击各目录项前面的“+”号,将所有目录项展开。 (3)双击main函数名,在文档窗口
11、中显示出main函数体所在的源文件Ex_Hello.cpp,且文本光标已移至此函数名的前面。 (4) 键入下列代码: . #include / 输入输出操作的头文件 int main(int argc, char* argv) coutHello world!n; return 0; (5) 用Save All命令项或标准工具栏的Save All按钮将所有文件保存,1.6一个控制台应用程序,1.6.4编译运行 打开Build菜单,选用Build Ex_Hello.exe菜单项或按快捷键F7,系统对Ex_Hello进行编译、连接,同时在输出窗口中在线地显示出编译的内容,当出现Ex_Hello.e
12、xe - 0 error(s), 0 warning(s)字样时,表示Ex_Hello.exe可执行文件已经正确无误地生成了。 在Build菜单中选取Execute Ex_Hello.exe命令或按快捷键Ctrl+F5,就可以运行刚刚生成的Ex_Hello.exe,如图。 在Ex_Hello窗口中,“Press any key to continue”是系统自动加上去的,图1.29 Ex_Hello运行结果,1.7程序调试,1.7.1修正语法错误 调试最初的任务主要是修正一些语法错误,这些错误包括: (1) 未定义或不合法的标识符,如函数名、变量名和类名等。 (2) 数据类型或参数类型及个数不
13、匹配。 上述错误在编译后,会在Output窗口中列出所有错误项。若将光标移到Output窗口中的错误编号上,按F1键可启动MSDN并显示出错误的内容,从而帮助用户理解错误产生的原因。 为了能使快速定位到错误产生的源代码位置,提供下列一些方法: (1) 在Output窗口中双击某个错误,或将光标移到该错误处按Enter键,则该错误被亮显,状态栏上显示出错误内容,并定位到相应的代码行中,且该代码行最前面有个蓝色箭头标志。 (2)按F4键可显示下一错误,并定位到相应的源代码行。 (3)在Output窗口中的某个错误项上,右击鼠标,在弹出的快捷菜单中选择“Go To Error/Tag”命令。 语法错
14、误被修正后,编译时会出现类似“Ex_Hello.exe - 0 error(s), 0 warning(s)”的字样。并不是说,此项目完全没有错误,可能还有“异常”、“断言”等其他错误,而这些错误在编译时是不会显示出来的,只有当程序运行后才会出现,1.7程序调试,1.7.2设置断点 调试的断点可以有下列类型:(1)位置断点 、(2)数据断点、(3)条件断点。 快捷方式 三种快捷方式可以设置位置断点: (1) 按快捷键F9。 (2) 在Build工具栏上单击 按钮。 (3) 在需要设置断点的位置右击,选择“Insert/Remove Breakpoint”命令,1.7程序调试,使用Breakpo
15、ints对话框 (1) 凡是可以使用的断点前均有选中标记()。若单击前面的复选框,则该断点被禁止。按钮Remove和Remove All清除当前选中的断点或全部断点。 (2) 在Location页面中,“Break At”文本框中可以输入断点的名称。单击Edit Code可以查看断点位置处的源代码或目标代码。单击Condition ,可以输入程序运行中断所需要的表达式条件,从而设置一个条件断点。 (3) 在Data页面中,提供了一种设置数据断点的方法,如图。在Data页面的最上面编译框中,可以键入任何有效的C/C+表达式,它可以是赋值语句,可以是条件语句,可以是单独的一个变量名。在程序运行过程
16、中,若变量的值有所改变,或者条件表达式变成真时,则程序在该断点处中断,图1.31 “Breakpoints”对话框,图1.32 Data页面,1.7程序调试,1.7.3启用调试器 选择“Project”菜单“Settings”命令,如图。在调试程序时必须使用Debug版本。通过选择“Debug info”组合框来设置调试选项。含义如表。还可以在“Project Settings”对话框中的“Link”页面中,选中“Generate mapfile”项,使其在编连时产生相应的映射文件。 选择“Build”菜单“Start Debug”子菜单的“Go”、“Step Into”或“Run To Cu
17、rsor”命令,就可以启动调试器了,图1.33 “Project Settings”对话框,1.7程序调试,1.7.4控制程序运行 当程序开始运行在Debug状态下时,程序会由于断点而停顿下来。这时可以看到有一个小箭头,它指向即将执行的代码。而且,原来的“Build”菜单就会变成“Debug”菜单,如图1.34所示。其中有四条命令Step Into、Step Over、Step Out和Run to Cursor是用来控制程序运行的,其含义是: nStep Over的功能是运行当前箭头指向的代码(只运行一条代码)。 nStep Into的功能是如果当前箭头所指的代码是一个函数的调用,则用Ste
18、p Into 进入该函数进行单步执行。 nStep Out的功能是如果当前箭头所指向的代码是在某一函数内,用它使程序运行至函数返回处。 n Run to Cursor的功能是使程序运行至光标所指的代码处,1.7程序调试,1.7.5查看和修改变量的值 调试器还提供一系列的窗口,用来显示各种不同的调试信息。可借助“View”菜单下的“Debug Windows”子菜单可以访问它们。当启动调试器后,VC的开发环境会自动显示出Watch和Variables两个调试窗口,且Output窗口自动切换到Debug页面,如图,图1.34 Debug菜单,Watch窗口,Output窗口,Variables窗口
19、,1.7程序调试,QuickWatch窗口的使用 用来帮助用户快速查看或修改某个变量或表达式的值。若仅需要快速查看变量或表达式的值,则只需要将鼠标指针直接放在该变量或表达式上,片刻后,系统会自动弹出一个小窗口显示出该变量或表达式的值。 启动调试器后,选择“Debug”“QuickWatch”或按快捷键Shift+F9,如图。 Expression框可以让用户键入变量名或表达式,而后按Enter键或单击Recalculate,就可以在Current value列表中显示出相应的值。若想要修改其值的大小,则可按Tab键或在列表项的“Value”域中双击该值,再输入新值按Enter键就可以了。 单击
20、Add Watch按钮可将刚才输入的变量名或表达式及其值显示在“Watch”窗口中,图1.36 “QuickWatch”窗口,1.7程序调试,Watch窗口的使用 选择“View”“Debug Windows”“Watch”,四个页面:Watch1、Watch2、Watch3和Watch4 ,在每一个页面中有要查看的变量或表达式,可以将一组变量或表达式的值显示在同一个页面中。使用Watch窗口进行操作时,要注意到下面一些技巧: (1)添加新的变量或表达式 选定窗口中某个页面,在末尾的空框处,单击左边的“Name”域,输入变量或表达式,按Enter键。同时,又在末尾处出现新的空框,如图。 在变量
21、或表达式中右击,选择“Properties”查看其类型。 (2)修改变量或表达式的值 选中相应的变量或表达式,按Tab键或在列表项的“Value”域中双击该值,再输入新值按Enter键就可以了。 (3)删除变量或表达式 单击Del键可将当前选定的变量或表达式删除,1.7程序调试,Variables窗口的使用 Variables窗口能快速访问程序当前的环境中所使用的重要变量。选择“View”“Debug Windows”“Variables”,其中有三个页面: Auto页面 显示出当前语句和上一条语句使用的变量,还显示使用Step Over或Step Out命令后函数的返回值。 Locals页面
22、 显示出当前函数使用的局部变量。 This页面 显示出由This所指向的对象。 Variables窗口还有一个“Context”框,从下拉列表中可以选定当前Call Stack的指令,以确定在页面中显示变量的范围,如图,图1.38 “Context”框,第2章基本C+语言,2.1 C+程序结构 2.2 数据类型和基本输入输出 2.3 运算符和表达式 2.4 基本语句 2.5 函数和预处理 2.6 构造类型 2.7 指针和引用 上机训练,2.1C+程序结构,2.1.1几个C+程序 例1 在屏幕上输出一个由星号形成的三角形。 / 输出星号的三角形阵列 #include void DoDraw(in
23、t num); / 声明一个全局函数 void main() int num=5; / 定义并初始化变量 DoDraw(num);/ 函数的调用 void DoDraw(int num)/ 函数的定义 for (int i=0; inum; i+)/ 循环语句 for (int j=0; j=i; j+) cout*; coutn;,2.1C+程序结构,例Ex_Simple2 用类的概念重写例Ex_Draw。 / 输出星号的三角形阵列 #include class CDrawArray/ 定义一个类 public: void DoDraw(int num);/ 声明类的公有成员函数 ; voi
24、d CDrawArray:DoDraw(int num)/ 成员函数的实现 for (int i=0;inum;i+) for (int j=0;j=i;j+) cout*; coutn; void main() int num=5; CDrawArray myDraw;/ 定义类的一个对象 myDraw.DoDraw(num);/ 调用此对象的成员函数,2.1C+程序结构,2.1.2C+程序的基本组成 C+程序往往由预处理命令、语句、函数、变量和对象、输入与输出以及注释等几个基本部分组成的。 (1) 预处理命令 在程序的一开始出现含有以“#”开头的命令,它们是预处理命令。三类预处理命令:宏定
25、义命令、文件包含命令和条件编译命令。 (2) 语句 可以是用来判断的条件语句,可以是用来反复运行的循环语句等。 (3) 函数 一个程序由若干个函数组成。有的是系统中所提供的库函数,有的是根据自己需要自己编制设计的函数。程序中必须有一个且只能有一个主函数main。 (4) 变量和对象 变量的类型有整型(int)、字符型(char)以及浮点型(float)等。对象通常是指“类”的实例(具有该“类”类型的变量),如myDraw是类CDrawArray的对象。 (5) 输入与输出 使用输入与输出可以要求键入一些数值或把计算的结果显示在屏幕上。 (6) 注释 程序的目的不仅在于实现某种功能、解决某个问题
26、,而且还在于数据结构和算法的交流。注释能提高程序的可读性,帮助用户对程序的理解,2.1C+程序结构,2.1.3C+程序的书写风格 标识符命名 用来标识变量名、函数名、数组名、类名、对象名、类型名、文件名等的有效字符序列。标识符命名的好坏也会影响程序的可读性,命名时注意: (1) 合法性 标识符由大小写字母、数字字符(09)和下划线组成,第一个字符必须为字母或下划线。任何标识符中都不能有空格、标点符号及其他字符。注意,标识符的大小写是有区别的。用户定义的标识符不能和系统的关键字同名。 (2) 有效性 标识符的长度(组成标识符的字符个数)是任意的,最好不超过32个,因为有的编译系统只能识别前32个
27、字符,也就是说前32个字符相同的两个不同标识符被有的系统认为是同一个标识符。 (3) 易读性 在定义标识符时,若能做到“见名知意”就可以达到易读性的目的,2.1C+程序结构,缩进和注释 缩进是指程序在书写时不要将程序的每一行都由第一列开始,在适当的地方加进一些空行或空格。它同注释一样,也是为了提高程序的可读性。 注释要注意的是: (1)注释应在编程的过程中同时进行,不要指望程序开发完成后再补写注释。那样只会多花好几倍的时间,更为严重的是,时间长了以后甚至会读不懂自己写的程序。 (2)必要的注释内容应包含:源程序的总体注释(文件名、作用、创建时间、版本、作者及引用的手册、运行环境等)、函数注释(
28、目的、算法、使用的参数和返回值的含义、对环境的一些假设等)及其他的少量注释。千万不要陈述那些一目了然的内容,否则会使注释的效果适得其反,2.2数据类型和基本输入输出,2.2.1基本数据类型 使用基本数据类型时需要注意: (1)无符号和有符号的区别在于数值最高位的含义。对signed类型,最高位是符号位,其余各位表示数值大小;unsigned类型的各个位都用来表示数值大小;相同基本数据类型的signed和unsigned的数值范围是不同。 (2) char、short、int和long可统称为整型。缺省时,char、short、int和long本身是有符号(signed)的,2.2数据类型和基本
29、输入输出,2.2.2常量 整型常量 (1) 十进制整型常量:即十进制整数,如34、128等。 (2) 八进制整型常量:以0开头的数,由0至7的数字组成。 (3) 十六进制整型常量:以0 x或0X开头的数,由0至9、A至F或a至f组成。 需要注意的是: 整型常量中的长整型(long)要以L或小写字母l作为结尾。 整型常量中的无符号型(unsigned)要以U或u作为结尾。 浮点型常量 (1) 十进制数形式:由整数部分和小数部分组成。 (2) 指数形式:采用科学表示法,能表示出很大或很小的浮点数。 若浮点型常量是以F(或f)结尾的,则表示单精度类型(float),以L(或小写字母l)结尾的,表示长
30、双精度类型(long double)。若一个浮点型常量没有任何说明,表示双精度类型(double,2.2数据类型和基本输入输出,字符常量 字符常量是用单引号括起来的一个字符,2.2数据类型和基本输入输出,字符串常量 字符串常量是一对双引号括起来的字符序列。可以包含空格、转义序列符或其他字符。由于双引号是字符串的分界符,因此如果需要在字符串中出现双引号则必须用“”表示。例如: “Please press ”F1” to help!” 这个字符串被解释为: Please press “F1” to help! 字符串常量必须在同一行书写,若一行写不下,则需要用来连接,不要将字符常量和字符串常量混淆
31、不清,它们主要的区别如下: (1)字符常量用单引号括起来,占一个字节;字符串常量是用双引号括起来,至少占用两个字节。例如a是字符常量,占有的一个字节用来存放字符a的ASCII码值,而“a”是字符串常量,它的长度不是1而是2,除了字符a之外,它的末尾还有个0字符。每个字符串的末尾都有一个这样的字符。 (2)字符常量实际上是整型常量的特殊形式,它可以参与常用的算术运算;而字符串常量则不能。例如: int b= a+3;/ 结果b为100,这是因为将a的ASCII码值97参与运算,2.2数据类型和基本输入输出,符号常量 例Ex_PI1 用#define定义符号常量。 #include #define
32、 PI 3.14159 void main() double r = 100.0, area; area = PI * r * r; cout圆的面积是:area n;,2.2数据类型和基本输入输出,2.2.3变量 变量的定义 定义变量是用下面的格式语句进行定义的: ; 需要说明的是: (1) 在同一个程序块中,不能有两个相同的变量名。 (2) 没有字符串变量类型,字符串是用字符类型的数组或指针来定义的。 (3)与其他语言相比,C+变量的定义比较自由。 变量的初始化 程序中常需要对一些变量预先设置初值,这一过程称为初始化。可以在定义变量时同时使变量初始化,也可以在多个变量的定义语句中单独对某个
33、变量初始化。 需要注意的是,一个未初始化的变量不是没有数值,而是取决于变量在系统中的存储形式,它可能是系统的缺省值或无效值,2.2数据类型和基本输入输出,2.2.4基本输入输出 输出流(cout) 通过cout可以输出一个整数、实数、字符及字符串,cout中的插入符“ . 其中,提取符“”可以连续写多个,每个后面跟一个表达式,该表达式通常是获得输入值的变量或对象,2.3运算符和表达式,2.3.1算术运算符 算术运算符如下所示: +(正号运算符,如+4,+1.23等) -(负号运算符,如-4,-1.23等) *(乘法运算符,如6*8,1.4*3.56等) /(除法运算符,如6/8,1.4/3.5
34、6等) %(模运算符或求余运算符,如40%11等) +(加法运算符,如6+8,1.4+3.56等) -(减法运算符,如6-8,1.4-3.56等) 注意: (1) 除法运算 两个整数相除,结果为整数,如7/5的结果为1,它是将小数部分去掉,而不是四舍五入;若除数和被除数中有一个是浮点数,则进行浮点数除法,结果是浮点型。如7/5.0、7.0/5、7.0/5.0的结果都是1.4。 (2) 求余运算 求余运算要求参与运算的两个操作数都是整型,结果是两个数相除的余数。例如40%5的结果是0,40%11的结果是7。要理解负值的求余运算,例如40%-11结果是7,-40%11结果是-7,-40%-11结果
35、也是-7,2.3运算符和表达式,3) 优先级和结合性 将表达式的求值中多种运算之间的先后关系(即运算符之间的优先关系)用运算符的优先级表示,优先级的数值越小优先级越高。在算术运算符中,单目运算符的优先级最高,其次是乘、除和求余,最后是加减。 优先级相同的运算符,则按它们的结合性进行处理。运算符的结合性是指运算符和操作数的结合方式,有“从左至右”和“从右至左”。“从左至右的结合”指运算符左边的操作数先与运算符相结合,再与运算符右边的操作数进行运算;自右至左的结合次序是将运算符右边的操作数先与运算符相结合。 在算术运算符中,除单目运算符外,其余运算符的结合性都是从左至右的。 (4) 关于书写格式
36、在使用运算符进行数值运算时,若书写时没有在双目运算符两边加上空格,则有时编译系统会做出与自己想象中不同的理解。 书写时,有时有意识地加上一些括号。这样不仅增强程序的可读性,而且,尤其当对优先关系犹豫时,加上括号是保证正确结果的最好方法。 (5) 溢出处理 某数除以0或当其它浮点溢出时,编译系统将报告错误并终止程序运行。但对整数溢出,系统却不认为是一个错误,2.3运算符和表达式,2.3.2赋值运算符 复合赋值 10种复合赋值运算符:+=,-=,*=,/=,%=,=,|=,=,= 注意: (1) 在复合赋值运算符之间不能有空格,例如 += 不能写成 + = 。 (2) 所有运算符高于逗号运算符,复
37、合赋值运算符的结合性是从右至左的。 多重赋值 指在一个赋值表达式中出现两个或更多的赋值符(“=”),例如: nNum1 = nNum2 = nNum3 = 100; 赋值符的结合性是从右至左,上述赋值的过程:首先对nNum3 = 100求值,将100赋值给nNum3,同时该赋值表达式取得值100;然后将该值赋给nNum2,该赋值表达式也取得值100;最后将100赋给nNum1,2.3运算符和表达式,2.3.3数据类型转换 自动转换 将数据类型从低到高进行转换,例如:10 + a + 2*1.25 - 5.0/4L运算: (1)2*1.25的运算,将2和1.25都转换成double型,结果为do
38、uble型的2.5。 (2) 长整型4L和5.0转换成double型,5.0/4L结果为double型,值为1.25。 (3)进行10 + a 的运算,先将a转换成整数97,运算结果为107。 (4)整数107和2.5相加,先将整数107转换成double型,值为109.5。 (5)进行109.5 - 1.25的运算,结果为double型的108.25。 强制转换 强制类型有下列两种格式:()、(),2.3运算符和表达式,2.3.4关系运算符 是比较两个操作数是否符合给定的条件。若符合条件,则关系表达式的值为“真”,否则为“假”。在编译系统中,往往将“真”表示为“true”或1,将“假”表示为
39、“false”或0。而任何不为0的数被认为是“真”,0被认为是“假”。 由于关系运算需要两个操作数,所以关系运算符都是双目运算符。 提供了6种关系运算符: (大于),=(大于等于),= =(相等于), ! =(不等于) 其中,前4种的优先级相同且高于后面的两种。例如: a = b c等效于a = ( b c ) 但关系运算符的优先级低于算术运算符(其他可参见表2.6)。例如: a = b c等效于a = ( b c,2.3运算符和表达式,2.3.5逻辑运算符 将多个关系表达式或逻辑量组成一个逻辑表达式。提供了3种逻辑运算符: !逻辑非(单目):指将“真”变“假”,“假”变“真”。 注意,只有在
40、表达式2后面才能出现分号结束符,“表达式1”和“表达式2”中都不能有分号,2.3运算符和表达式,2.3.8增1和减1运算符 +和-既可放在变量的左边也可以出现在变量的右边,称为前缀运算符和后缀运算符。例如: i+; 或 +i;(等效于i = i + 1; 或i += 1;) i-; 或 -i;(等效于i = i - 1; 或i -= 1;) 若前缀运算符和后缀运算符仅用于某个变量的增1和减1,这两都是等价的,如果将这两个运算符和其他的运算符组合在一起,在求值次序上就会产生根本的不同: 如果用前缀运算符对一个变量增1(减1),在将该变量增1(减1)后,用新的值在表达式中进行其他的运算。 如果用后
41、缀运算符对一个变量增1(减1),用该变量的原值在表达式进行其他的运算后,再将该变量增1(减1)。 例如: a = 5; b = +a - 1;/ 相当于 a = a + 1; b = a 1; 和 a = 5; b = a+ -1; / 相当于 b = a 1; a = a + 1; 虽然它们中的a值的结果都是6,但b的结果却不一样,前者为5,后者为4,2.4基本语句,2.4.2选择语句 条件语句 条件语句if具有下列形式: if () else (1)条件语句中的表达式一般为逻辑表达式或关系表达式。表达式的类型也可以是任意的数值类型(包括整型、浮点型、字符型等)。 (2)适当添加花括号(“
42、”)来增加程序的可读性。 (3)条件语句中的语句1和语句2也可是if条件语句,这就形成了if语句的嵌套。 (4)else总是和其前面最近的if配套的,2.4基本语句,开关语句 具有下列形式: switch ( ) case :语句1 case :语句2 . case :语句n default :语句n+1 注意: (1)switch后面的表达式可以是整型、字符型或枚举型的表达式,而case后面的常量表达式的类型必须与其匹配。 (2)多个case可以共有一组执行语句。 (3)若同一个case后面的语句是复合语句,即有两条或两条以上的语句,则这些语句可以不用花括号(“”)括起来。 (4) 由于ca
43、se语句起标号作用,因此每一个case常量表达式的值必须互不相同,否则会出现编译错误,2.4基本语句,2.4.3循环语句 while循环语句 while循环语句具有下列形式: while () do.while循环语句 do.while循环语句具有下列形式: do while () for循环语句 for循环语句具有下列形式: for (表达式1;表达式2;表达式3) (1) 表达式1、表达式2、表达式3都可以省略,但分号“;”不能省略。 (2) 表达式1和表达3可以是一个简单的表达式,也可以是逗号表达式,即包含两个或两个以上的简单表达式,中间用逗号分隔。 (3) 由于循环体是由任何类型的语句
44、组成的,因此在循环体内还可以包含前面的几种循环语句,这样就形成了循环的嵌套,2.4基本语句,2.4.4break和continue语句 若需跳出循环结构或重新开始循环,就得使用break和continue语句,格式: break;从一个循环体跳出,即提前终止循环,也可以跳出switch结构。 continue;用于那些依靠条件判断而进行循环的循环语句。对于for语句来说,目的是将流程转到for语句的表达2和表达式3。例如: 例Ex_Continue 把1100之间的不能被7整除的数输出。 #include void main() for (int nNum=1; nNum=100; nNum+
45、) if (nNum%7 = 0) continue; coutnNum ; coutn; 当nNum能被7整除时,执行continue语句,流程转到for 语句中的nNum=100; nNum+,并根据表达式nNum=100的值来决定是否再做循环。而当nNum不能被7整除时,才执行coutnNum” ”语句,2.5函数和预处理,2.5.1函数的定义和调用 函数的定义 定义一个函数的格式如下: ( ) 函数体 函数类型决定了函数所需要的返回值类型。函数名后面必须跟一对圆括号“( )”,以区别于变量名及其他用户定义的标识名。函数的形式参数写在括号内,参数表中参数个数可以是0,一个或多个参数,圆括
46、号不能省略。函数体由在一对花括号中的若干条语句组成,用于实现这个函数执行的动作。 函数的声明 声明一个函数可按下列格式进行: ( ); int sum(int x, int y);和 int sum(int , int);是等价的,2.5函数和预处理,函数的调用 函数调用的一般形式为: ( ); 所谓“实际参数”(简称“实参”),它与“形参”相对应,是实际调用函数时所给定的常量、变量或表达式,且必须有确定的值。例如: int a5 = 7, 9, 6, 3, 4; sum(a0, 6); 或 sum(a0*a1, a2+a3); 等都是合法的调用。需要注意的是:实参与形参的个数应相等,类型应一
47、致,且按顺序对应,一一传递数据。 C+中,调用一个函数的方式可以有很多,例如: sum(3, 4);/ A int c = 2 * sum(4,5);/ B c = sum(c, sum(c,4);/ C 其中,A是将函数作为一个语句,不使用返回值,只要求函数完成一定的操作;B把函数作为表达式的一部分,将返回值参与运算,结果c = 18;C是将函数作为函数的实参,等价于“c = sum(18, sum(18,4);”,执行sum(18,4)后,等价于“c = sum(18,22) ;”,最后结果为c = 40,2.5函数和预处理,2.5.2函数的参数传递 函数的参数传递有两种方式,一种是按值传
48、递,另一种是地址传递或引用传递。 例Ex_SwapValue 交换函数两个参数的值。 #include void swap(float x, float y) float temp; temp = x; x = y; y = temp; coutx = x, y = yn; void main() float a = 20, b = 40; couta = a, b = bn; swap(a, b); couta = a, b = bn; 运行结果为: a = 20, b = 40 x = 40, y = 20 a = 20, b = 40 值传递的最大好处是保持函数的独立性。在值传递的情况下
49、,函数只有通过return来返回某个类型的值,2.5函数和预处理,2.5.3作用域和存储类型 作用域 (1) 块作用域 在块中声明的标识符,作用域从声明处开始,一直到结束块的花括号为止。具有块作用域的标识符称作局部标识符,块作用域也称作局部作用域 标识符的作用域完全相同时,不允许出现相同的标识符名。标识符具有不同的作用域时,允许标识符同名。 在for语句中声明的标识符,其作用域是包含for语句的那个内层块,而不是仅仅作用于for语句。 (2) 函数原型作用域 在声明函数原型所指定的参数标识符的作用范围。这个作用范围是在函数原型声明中的左、右括号之间。在函数原型中声明的标识符可以与函数定义中说明
50、的标识符名称不同。由于所声明的标识符与该函数的定义及调用无关,所以可以在函数原型声明中只作参数的类型声明,而省略参数名。 (3) 函数作用域 C+语言中,只有goto语句中的标号标识符具有函数作用域。具有函数作用域的标识符在声明它的函数内随处可见,但在此函数之外不可见。goto语句的滥用导致程序流程无规则、可读性差,2.5函数和预处理,变量的存储类型 存储类型的声明格式: ; (1) 自动类型(auto) 一般说,自动存储类型声明的变量都是限制在某个程序范围内使用的。从系统角度来说,自动存储类型变量是采用堆栈方式分配内存空间。程序执行到超出该变量的作用域时,就释放它所占用的内存空间,其值也随之
51、消失了。 声明一个自动存储类型的变量是在变量类型前面加上关键字auto 若自动存储类型的变量是在函数内或语句块中声明,可省略auto, (2) 静态类型(static) 它和自动存储类型的变量的最大不同之处在于:静态类型变量在内存中是以固定地址存放的,而不是以堆栈方式存放的。只要程序还在继续执行,静态类型变量的值就一直有效,不会随它所在的函数或语句块的结束而消失。 静态类型的变量均有确定的初值,当声明变量时没有指定其初值,则编译器将其初值置为0。 在程序中声明的全局变量总是静态存储类型,若在全局变量前加一个static,使该变量只在这个源程序文件内使用,称之为全局静态变量或静态全局变量。 静态
52、函数也是在某个函数声明前加上static,它的目的也是使该函数只在声明的源文件中使用,对于其他源文件则无效,2.5函数和预处理,3) 寄存器类型(register) 使用关键字register声明寄存器类型的变量的目的是将所声明的变量放入寄存器内,从而加快程序的运行速度。但有时,在使用这种声明时,若系统寄存器已经被其他数据占据时,寄存器类型的变量就会自动当作auto变量。 (4) 外部类型(extern) 用关键字extern声明的变量称为外部变量。某个变量被声明成外部变量时,不必再次为它分配内存就可以在本程序中引用这个变量。只有在两种情况下要使用外部变量: 第一种情况,在同一个源文件中,若定
53、义的变量使用在前,声明在后,这时在使用前要声明为外部变量。 第二种情况,当由多个文件组成一个完整的程序时,在一个源程序文件中完全定义的变量要被其他若干个源文件引用时,引用的文件中要使用extern声明外部变量,2.5函数和预处理,2.5.4函数的重载 函数重载是指C+允许多个同名的函数存在,但同名的各个函数的形参必须有区别:形参的个数不同,或者形参的个数相同,但参数类型有所不同。 需要说明的是: (1)重载函数必须具有不同的参数个数或不同的参数类型,若只有返回值的类型不同是不行的。 (2)当函数的重载带有默认参数时,应该注意避免二义性。例如: int fun(int a, int b = 0)
54、; int fun(int a); 是错误的。因为如果有函数调用fun(2)时,编译器无法准确地确定应调用哪个函数,2.5函数和预处理,2.5.3预处理 宏定义命令 #define PI 3.141593 (1)#define、PI和3.141593之间一定要有空格,且一般将宏名定义成大写,以与普通标识符相区别。 (2)宏被定义后,一般不能再重新定义,而只有当使用如下命令才可以: #undef 宏名 (3) 一个定义过的宏名可以用来定义其它新的宏,但要注意其中的括号。 (4)上述宏定义是简单的一种形式,实际上它还可以带参数,例如: #defineMAX(a,b) (a)(b)?(a):(b)
55、文件包含命令 有下列两种格式: #include #include “文件名” 在使用#include命令需要注意的是,一条#include命令只能包含一个文件,若想包含多个文件须用多条文件包含命令,2.5函数和预处理,条件编译命令 (1) 第一种形式 #ifdef #else #endif 例Ex_UseIfdef 使用#ifdef条件编译命令。 #include #define A -1 void main() #if A0 cout0n; #elif A0 couta0n; #else couta=0n; #endif 运行结果: a0,2.5函数和预处理,2) 第二种形式 #ifnde
56、f #else #endif 这与前一种形式的区别仅在于,如果标识符没有被#define命令定义过,则编译,否则就编译。 (3) 第三种形式 #if #elif . #else #endif,2.5函数和预处理,例Ex_UseIf 使用#if条件编译命令。 #include #define A -1 void main() #ifA0 cout0n; #elif A0 couta0n; #else couta=0n; #endif 运行结果为: a0 若将#define A -1改为 #define A 0 则结果为: a=0,2.6构造类型,2.6.3结构体 定义结构体 结构体定义的格式为:
57、 struct ; ; . ; 结构变量名表; 注意: (1) 在定义结构体时,不要忘记最后一个花括号后面的分号“;”。 (2) 结构体的成员变量可以是基本数据类型,也可以是其他合法的类型。例如: struct STUDENT PERSONone;/ 用已定义的结构体类型声明成员 float eng, phy, math, poli;/ 英语、物理、数学和政治的成绩,2.6构造类型,结构体变量的初始化和引用 结构体变量的初始化的一般形式是在变量后面加上:= ; 当一个结构体变量定义之后,就可引用这个变量。使用时,遵循下列规则: (1) 只能引用结构体变量中的成员变量,并使用下列格式: . (2
58、)若成员本身又是一个结构体变量,引用时需要用多个成员运算符一级一级地找到最低一级的成员。 (3)结构类型相同的变量之间可以直接赋值,这种赋值等效于各个成员的依次赋值。例如: struct PERSON int age;/ 年龄 char name25;/ 姓名 ; PERSON one = 30, LiMing; PERSON another = one; n;/ 输出LiMing 其中,another = one等效于: another.age = one.age; strcpy(, ,2.6构造类型,2.6.4传递结构
59、体参数 例Ex_StructValue 将结构体的值作为参数传给函数。 #include struct PERSON int age; / 年龄 float weight;/ 体重 char name25;/ 姓名 ; void print(PERSON one) one.age one.weightn; PERSON all4 = 20, 60, Zhang,28, 50, Fang , 33, 78, Ding ,19, 65, Chen ; void main() for (int i=0; i4; i+)print(alli); 运行结果为: Zhang 20 60 Fang 28 50 Ding 33 78 Chen 19 65,2.7指针和引用,2.7.1指针和指针变量 程序中定义了一个变量,编译时系统会给这个变量分配内存单元,根据程序中定义的变量类型,分配一定长度的内存空间,每个内存单元中存放着变量的值。系统为每一个内存单元分配一个地址。这个“地址”称为“指针”。 指针变量(pointer)是存放内存地址的变量,一般情况下该地址是另一个变量存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 程序员的职业素养与能力分析试题及答案
- 代入股合同协议书样本
- 理解C语言中的模块化设计策略试题及答案
- 阳江市阳春市招聘公益性岗位考试真题2024
- 快递点租赁合同协议书
- 计算机一级Photoshop用户体验设计试题及答案
- 入库怎么理解合同协议书
- 了解嵌入式考试的变革试题及答案
- 宁波北仑区妇幼保健院招聘用工人员笔试真题2024
- 马边彝族自治县事业单位招聘工作人员笔试真题2024
- 六、回顾整理-总复习2.图形的认识与测量(二)-平面图形的周长和面积(课件)青岛版六年级下册数学
- 中医养生(灵源万应茶)
- 追索子女抚养费起诉状
- 六年级数学质量分析PPT
- 土地平整、池塘推土、杂草灌木丛及树木清除施工方案
- 眼镜镜架的整形专业培训2课件
- 下线仪式串词策划
- 通用长期供销合同范本
- 《社区治理研究国内外文献综述(1900字)》
- 2023浙江省学生艺术特长测试A级理论复习资料
- 建筑业企业资质职称人员相近专业认定目录
评论
0/150
提交评论