收藏 分销(赏)

谭浩强c程序设计版.pptx

上传人:丰**** 文档编号:8688566 上传时间:2025-02-25 格式:PPTX 页数:1228 大小:3.30MB
下载 相关 举报
谭浩强c程序设计版.pptx_第1页
第1页 / 共1228页
谭浩强c程序设计版.pptx_第2页
第2页 / 共1228页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版副标题样式,单击此处编辑母版标题样式,单击此处编辑母版副标题样式,C+,程序设计,中国高等院校计算机基础教育课程体系规划教材,谭浩强 编著,总 目 录,第1篇 基 本 知 识,第1章,C+,的初步知识,第2章 数据类型与表达式,第2篇 面向过程的程序设计,第3章 程序设计初步,第4章 函数与预处理,第5章 数组,第6章 指针,第7章 自定义数据类型,第3篇 基于对象的程序设计,第8章 类和对象,第9章 关于类和对象的进一步讨论,第10章 运算符重载,第4篇 面向对象的程序设计,第11章 继承与派生,第12章 多态性与虚函数,第13章 输入输出流,第14章,C+,工具,第1章,C+,的初步知识,第2章 数据类型与表达式,第,1,篇基 本 知 识,第1章,C+,的初步知识,*1.1,从,C,到,C+,*1.2,最简单的,C+,程序,1.3,C+,程序的构成和书写形式,1.4,C+,程序的编写和实现,1.5 关于,C+,上机实践,计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。世界上第一种计算机高级语言诞生于1954年,它是,FORTRAN,语言。先后出现了多种计算机高级语言。其中使用最广泛、影响最大的当推,BASIC,语言和,C,语言。,BASIC,语言是1964年在,FORTRAN,语言的基础上简化而成的,它是为初学者设计的小型高级语言。,C,语言是1972年由美国贝尔实验室的,D.M.Ritchie,研制成功的。它不是为初学者设计的,而是为计算机专业人员设计的。大多数系统软件和许多应用软件都是用,C,语言编写的。,*1.1 从,C,到,C+,但是随着软件规模的增大,用,C,语言编写程序渐渐显得有些吃力了。,C+,是由,AT&T Bell(,贝尔)实验室的,Bjarne Stroustrup,博士及其同事于20世纪80年代初在,C,语言的基础上开发成功的。,C+,保留了,C,语言原有的所有优点,增加了面向对象的机制。,C+,是由,C,发展而来的,与,C,兼容。用,C,语言写的程序基本上可以不加修改地用于,C+。,从,C+,的名字可以看出它是,C,的超集。,C+,既可用于面向过程的结构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。,C+,对,C,的,“,增强,”,,表现在两个方面:,(1)在原来面向过程的机制基础上,对,C,语言的功能做了不少扩充。,(2)增加了面向对象的机制。,面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。,不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。,学习,C+,,既要会利用,C+,进行面向过程的结构化程序设计,也要会利用,C+,进行面向对象的程序设计。本书既介绍,C+,在面向过程程序设计中的应用,也介绍,C+,在面向对象程序设计中的应用。,例1.1 输出一行字符:,“,This is a C+program.,”,。,程序如下:,#,include /,包含头文件,iostream,using namespace std;/,使用命名空间,std,int main(),coutab;/,输入语句,sum=a+b;/,赋值语句,couta+b=sumy)z=x;/if,语句,如果,xy,,则将,x,的值赋给,z,else z=y;/,否则,将,y,的值赋给,z,return(z);/,将,z,的值返回,通过,max,带回调用处,/,max,函数结束,int main()/,主函数,/主函数体开始,int a,b,m;/,变量声明,cinab;/,输入变量,a,和,b,的值,m=max(a,b);/,调用,max,函数,将得到的值赋给,m,coutmax=mab;,c=max(a,b);/,调用,max,函数,coutmax=cy)z=x;,else z=y;,return(z);,只要在被调用函数的首部的末尾加一个分号,就成为对该函数的函数声明。函数声明的位置应当在函数调用之前。,下面举一个包含类(,class),和对象(,object),的,C+,程序,目的是使读者初步了解,C+,是怎样体现面向对象程序设计方法的。,例1.4 包含类的,C+,程序。,#,include /,预处理命令,using namespace std;,class Student /,声明一个类,类名为,Student,private:/,以下为类中的私有部分,int num;/,私有变量,num,int score;/,私有变量,score,public:/,以下为类中的公用部分,void setdata()/,定义公用函数,setdata,cinnum;/,输入,num,的值,cinscore;/,输入,score,的值,void display()/,定义公用函数,display,coutnum=numendl;/,输出,num,的值,coutscore=scoreendl;/,输出,score,的值,;,;/类的声明结束,Student stud1,stud2;/,定义,stud1,和,stud2,为,Student,类的变量,称为对象,int main()/,主函数首部,stud1.setdata();/,调用对象,stud1,的,setdata,函数,stud2.setdata();/,调用对象,stud2,的,setdata,函数,stud1.display();/,调用对象,stud1,的,display,函数,stud2.display();/,调用对象,stud2,的,display,函数,return 0;,在一个类中包含两种成员:数据和函数,分别称为数据成员和成员函数。在,C+,中把一组数据和有权调用这些数据的函数封装在一起,组成一种称为,“,类(,class),”,的数据结构。在上面的程序中,数据成员,num,score,和成员函数,setdata,display,组成了一个名为,Student,的,“,类,”,类型。成员函数是用来对数据成员进行操作的。也就是说,一个类是由一批数据以及对其操作的函数组成的。,类可以体现数据的封装性和信息隐蔽。在上面的程序中,在声明,Student,类时,把类中的数据和函数分为两大类:,private(,私有的)和,public(,公用的)。把全部数据(,num,score),指定为私有的,把全部函数(,setdata,display),指定为公用的。在大多数情况下,会把所有数据指定为私有,以实现信息隐蔽。,具有,“,类,”,类型特征的变量称为,“,对象,”,(,object)。,程序中第1824行是主函数。,程序运行情况如下:,1001 98.5,(输入学生1的学号和成绩),1002 76.5,(输入学生2的学号和成绩),num=1001 (,输出学生1的学号),score=98.5 (,输出学生1的成绩),num=1002 (,输出学生2的学号),score=76.5 (,输出学生2的成绩),C+,程序的结构和书写格式归纳如下:,(1)一个,C+,程序可以由一个程序单位或多个程序单位构成。每一个程序单位作为一个文件。在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单元。,(2)在一个程序单位中,可以包括以下几个部分:,预处理命令。上节4个程序中都包括#,include,命令。,全局声明部分(在函数外的声明部分)。在这部分中包括对用户自己定义的数据类型的声明和程序中所用到的变量的定义。,1.3,C+,程序的构成和书写形式,函数。函数是实现操作的部分,因此函数是程序中必须有的和最基本的组成部分。每一个程序必须包括一个或多个函数,其中必须有一个(而且只能有一个)主函数(,main,函数)。,但是并不要求每一个程序文件都必须具有以上3个部分,可以缺少某些部分(包括函数)。,(3)一个函数由两部分组成:,函数首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。,一个函数名后面必须跟一对圆括号,函数参数可以缺省,如,int main()。,函数体,即函数首部下面的大括号内的部分。如果在一个函数中有多个大括号,则最外层的一对 为函数体的范围。,函数体一般包括:,局部声明部分(在函数内的声明部分)。包括对本函数中所用到的类型、函数的声明和变量的定义。,对数据的声明既可以放在函数之外(其作用范围是全局的),也可以放在函数内(其作用范围是局部的,只在本函数内有效)。,执行部分。由若干个执行语句组成,用来进行有关的操作,以实现函数的功能。,(4)语句包括两类。一类是声明语句,另一类是执行语句。,C+,对每一种语句赋予一种特定的功能。语句是实现操作的基本成分,显然,没有语句的函数是没有意义的。,C+,语句必须以分号结束。,(5)一个,C+,程序总是从,main,函数开始执行的,而不论,main,函数在整个程序中的位置如何。,(6)类(,class),是,C+,新增加的重要的数据类型,是,C+,对,C,的最重要的发展。有了类,就可以实现面向对象程序设计方法中的封装、信息隐蔽、继承、派生、多态等功能。在一个类中可以包括数据成员和成员函数,他们可以被指定为私有的(,private),和公用的(,public),属性。私有的数据成员和成员函数只能被本类的成员函数所调用。,(7),C+,程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。,C+,程序没有行号,也不像,FORTRAN,或,COBOL,那样严格规定书写格式(语句必须从某一列开始书写)。,(8)一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。,C+,还保留了,C,语言的注释形式,可以用,“,/*,*/,”,对,C+,程序中的任何部分作注释。在,“,/*,”,和,“,*/,”,之间的全部内容作为注释。,用,“,/,”,作注释时,有效范围只有一行,即本行有效,不能跨行。而用,“,/*,*/,”,作注释时有效范围为多行。只要在开始处有一个,“,/*,”,,在最后一行结束处有一个,“,*/,”,即可。因此,一般习惯是:内容较少的简单注释常用,“,/,”,,内容较长的常用,“,/*,*/,”,。,一个程序从编写到最后得到运行结果要经历以下一些步骤。,1.用,C+,语言编写程序,用高级语言编写的程序称为,“,源程序,”,(,source program)。C+,的源程序是以.,cpp,作为后缀的(,cpp,是,c plus plus,的缩写)。,2.对源程序进行编译,为了使计算机能执行高级语言源程序,必须先用一种称为,“,编译器(,complier),”,的软件(也称编译程序或编译系统),把源程序翻译成二进制形式的,“,目标程序(,object program),”,。,1.4,C+,程序的编写和实现,编译是以源程序文件为单位分别编译的。目标程序一般以.,obj,或.,o,作为后缀(,object,的缩写)。编译的作用是对源程序进行词法检查和语法检查。编译时对文件中的全部内容进行检查,编译结束后会显示出所有的编译出错信息。一般编译系统给出的出错信息分为两种,一种是错误(,error);,一种是警告(,warning),。,3.将目标文件连接,在改正所有的错误并全部通过编译后,得到一个或多个目标文件。此时要用系统提供的,“,连接程序(,linker),”,将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终形成一个可执行的二进制文件,它的后缀是.,exe,,是可以直接执行的。,4.运行程序,运行最终形成的可执行的二进制文件(.,exe,文件),得到运行结果。,5.分析运行结果,如果运行结果不正确,应检查程序或算法是否有问题。,图,1.1,在了解了,C+,语言的初步知识后,读者最好尽快在计算机上编译和运行,C+,程序,以加深对,C+,程序的认识,并初步掌握,C+,的上机操作。,读者可以使用不同的,C+,编译系统,在不同的环境下编译和运行一个,C+,程序。但是需要强调的是,我们学习的是,C+,程序设计,应当掌握的是标准,C+,,而不应该只了解某一种,“,方言化,”,的,C+。,不应当只会使用一种,C+,编译系统,只能在一种环境下工作,而应当能在不同的,C+,环境下运行自己的程序,并且了解不同的,C+,编译系统的特点和使用方法,在需要时能将自己的程序方便地移植到不同的平台上。,1.5 关于,C+,上机实践,在本书的参考书,C+,程序设计题解与上机指导一书中简单介绍了在,Visual C+6.0,和,GCC,两种典型的环境下运行,C+,程序的方法。,请读者选择一种(如能做到两种更好),C+,编译系统,在该环境下输入和运行习题中的程序,掌握上机的方法和步骤。,第,2,章 数据类型与表达式,2.1 C+,的数据类型,2.2 常量,2.3 变量,2.4,C+,的运算符,2.5 算术运算符与算术表达式,2.6 赋值运算符与赋值表达式,2.7 逗号运算符与逗号表达式,计算机处理的对象是数据,而数据是以某种特定的形式存在的(例如整数、浮点数、字符等形式)。不同的数据之间往往还存在某些联系(例如由若干个整数组成一个整数数组)。数据结构指的是数据的组织形式。例如,数组就是一种数据结构。不同的计算机语言所允许使用的数据结构是不同的。处理同一类问题,如果数据结构不同,算法也会不同。例如,对10个整数排序和对包含10个元素的整型数组排序的算法是不同的。,C+,可以使用的数据类型如下:,2.1,C+,的数据类型,数据类型基本类型整型短整型(,short int),整型(,int),长整型(,long int),字符型(,char),浮点型单精度型(,float),双精度型(,double),长双精度型(,long double),布尔型(,bool),构造类型枚举类型(,enum),数组类型,结构体类型(,struct),共用体类型(,union),类类型(,class),指针类型,引用类型,空类型(,void),布尔型就是逻辑型,空类型就是无值型。,C+,的数据包括常量与变量,常量与变量都具有类型。由以上这些数据类型还可以构成更复杂的数据结构。例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。,C+,并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各,C+,编译系统根据自己的情况作出安排。书中表2.1列出了,Visual C+,数值型和字符型数据的情况。,说明:,(1)整型数据分为长整型(,long int)、,一般整型(,int),和短整型(,short int)。,在,int,前面加,long,和,short,分别表示长整型和短整型。,(2)整型数据的存储方式为按二进制数形式存储,例如十进制整数85的二进制形式为1010101,则在内存中的存储形式如图2.1所示。,图2.1,(3)在整型符号,int,和字符型符号,char,的前面,可以加修饰符,signed(,表示,“,有符号,”,)或,unsigned(,表示,“,无符号,”,)。如果指定为,signed,,则数值以补码形式存放,存储单元中的最高位(,bit),用来表示数值的符号。如果指定为,unsigned,,则数值没有符号,全部二进制位都用来表示数值本身。例如短整型数据占两个字节,见图2.2。,图2.2,有符号时,能存储的最大值为2,15,-1,即32767,最小值为-32768。无符号时,能存储的最大值为2,16,-1,即65535,最小值为0。有些数据是没有负值的,可以使用,unsigned,,它存储正数的范围比用,signed,时要大一倍。,(4)浮点型(又称实型)数据分为单精度(,float)、,双精度(,double),和长双精度(,long double)3,种,在,Visual C+6.0,中,对,float,提供6位有效数字,对,double,提供15位有效数字,并且,float,和,double,的数值范围不同。对,float,分配4个字节,对,double,和,long double,分配8个字节。,(5)表中类型标识符一栏中,方括号 包含的部分可以省写,如,short,和,short int,等效,,unsigned int,和,unsigned,等效。,常量的值是不能改变的,一般从其字面形式即可判别是否为常量。常量包括两大类,即数值型常量(即常数)和字符型常量。如12,0,-3为整型常量,4.6,-1.23为实型常量,包含在两个单撇号之间的字符为字符常量,如,a,x。,这种从字面形式即可识别的常量称为,“,字面常量,”,或,“,直接常量,”,。,2.2,常量,2.2.1,什么是常量,数值常量就是通常所说的常数。在,C+,中,数值常量是区分类型的,从字面形式即可识别其类型。,1.整型常量(整数)的类型,在上一节中已知道:整型数据可分为,int,short int,long int,以及,unsigned int,unsigned short,unsigned long,等类别。整型常量也分为以上类别。为什么将数值常量区分为不同的类别呢?因为在进行赋值或函数的参数虚实结合时要求数据类型匹配。,那么,一个整型常量怎样从字面上区分为以上的类别呢?,2.2.2,数值常量,(1)一个整数,如果其值在-32768+32767范围内,认为它是,short int,型,它可以赋值给,short int,型、,int,型和,long int,型变量。,(2)一个整数,如果其值超过了上述范围,而在-2147483648+2147483647范围内,则认为它是,long int,型,可以将它赋值给一个,int,或,long int,型变量。,(3)如果某一计算机系统的,C+,版本(例如,Visual C+),确定,int,与,long int,型数据在内存中占据的长度相同,则它们能够表示的数值的范围相同。因此,一个,int,型的常量也同时是一个,long int,型常量,可以赋给型或,long int,型变量。,(4)常量无,unsigned,型。但一个非负值的整数可以赋值给,unsigned,整型变量,只要它的范围不超过变量的取值范围即可。,一个整型常量可以用3种不同的方式表示:,(1)十进制整数。如1357,-432,0等。在一个整型常量后面加一个字母,l,或,L,,则认为是,long int,型常量。例如123,L,421L,0L,等,这往往用于函数调用中。如果函数的形参为,long int,,则要求实参也为,long int,型,此时用123作实参不行,而要用123,L,作实参。,(2)八进制整数。在常数的开头加一个数字0,就表示这是以八进制数形式表示的常数。如020表示这是八进制数20,即(20),8,,它相当于十进制数16。,(3)十六进制整数。在常数的开头加一个数字0和一个英文字母,X(,或,x),,就表示这是以十六进制数形式表示的常数。如0,X20,表示这是十六进制数20,即(20),16,,它相当于十进制数32。,2.浮点数的表示方法,一个浮点数可以用两种不同的方式表示:,(1)十进制小数形式。如21.456,-7.98等。它一般由整数部分和小数部分组成,可以省略其中之一(如78.或.06,.0),但不能二者皆省略。,C+,编译系统把用这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节。如果在实数的数字之后加字母,F,或,f,,表示此数为单精度浮点数,如1234,F,-43f,,占4个字节。如果加字母,L,或,l,,表示此数为长双精度数(,long double),,在,GCC,中占12个字节,在,Visual C+6.0,中占8个字节。,(2)指数形式(即浮点形式),一个浮点数可以写成指数形式,如3.14159可以表示为0.31415910,1,,3.1415910,0,31.415910,-1,314.15910,-2,等形式。在程序中应表示为:0.314159,e1,3.14159e0,31.4159e-1,314.159e-2,用字母,e,表示其后的数是以10为底的幂,如,e12,表示10,12,。,其一般形式为,数符 数字部分 指数部分,上面各数据中的0.314159,3.14159,31.4159,314.159 等就是其中的数字部分。可以看到:由于指数部分的存在,使得同一个浮点数可以用不同的指数形式来表示,数字部分中小数点的位置是浮动的。例如:,a=0.314159e1;,a=3.14159e0;,a=31.4159e-1;,a=314.159e-2;,以上4个赋值语句中,用了不同形式的浮点数,但其作用是相同的。,在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以指数形式(即浮点形式)存储的。例如不论在程序中写成314.159或314.159,e0,31.4159e1,3.14159e2,0.314159e3,等形式,在内存中都是以规范化的指数形式存放,如图2.3所示。,图2.3,数字部分必须小于1,同时,小数点后面第一个数字必须是一个非0数字,例如不能是0.0314159。因此314.159和314.159,e0,31.4159e1,3.14159e2,0.314159e3,在内存中表示成0.31415910,3,。存储单元分为两部分,一部分用来存放数字部分,一部分用来存放指数部分。为便于理解,在图2.3中是用十进制表示的,实际上在存储单元中是用二进制数来表示小数部分,用2的幂次来表示指数部分的。,对于以指数形式表示的数值常量,也都作为双精度常量处理。,1.普通的字符常量,用单撇号括起来的一个字符就是字符型常量。如,a,#,%,D,都是合法的字符常量,在内存中占一个字节。注意:字符常量只能包括一个字符,如,AB,是不合法的。字符常量区分大小写字母,如,A,和,a,是两个不同的字符常量。撇号()是定界符,而不属于字符常量的一部分。如,couta;,输出的是一个字母,“,a,”,,,而不是3个字符,“,a,”,。,2.2.3,字符常量,2.转义字符常量,除了以上形式的字符常量外,,C+,还允许用一种特殊形式的字符常量,就是以,“,”,开头的字符序列。例如,,n,代表一个,“,换行,”,符。,“,coutn;,”,将输出一个换行,其作用与,“,coutendl;,”,相同。这种,“,控制字符,”,,在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。,常用的以,“,”,开头的特殊字符见书中表2.2。,3.字符数据在内存中的存储形式及其使用方法,将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的,ASCII,代码放到存储单元中。如果字符变量,c1,的值为,a,c2,的值为,b,,则在变量中存放的是,a,的,ASCII,码97,,b,的,ASCII,码98,如图2.4(,a),所示,实际上在内存中是以二进制形式存放的,如图2.4(,b),所示。,图2.4,既然字符数据是以,ASCII,码存储的,它的存储形式就与整数的存储形式类似。这样,在,C+,中字符型数据和整型数据之间就可以通用。一个字符数据可以赋给一个整型变量,反之,一个整型数据也可以赋给一个字符变量。也可以对字符数据进行算术运算,此时相当于对它们的,ASCII,码进行算术运算。,例2.1 将字符赋给整型变量。,#,include,using namespace std;,int main(),int i,j;/i,和,j,是整型变量,i=A;/,将一个字符常量赋给整型变量,i,j=B;/,将一个字符常量赋给整型变量,j,couti jn;/,输出整型变量,i,和,j,的值,,n,是换行符,return 0;,执行时输出,65 66,i,和,j,被指定为整型变量。但在第5和第6行中,将字符,A,和,B,分别赋给,i,和,j,,它的作用相当于以下两个赋值语句:,i65;j66;,因为,A,和,B,的,ASCII,码为65和66。在程序的第5和第6行是把65和66直接存放到,i,和,j,的内存单元中。因此输出65和66。,可以看到:在一定条件下,字符型数据和整型数据是可以通用的。但是应注意字符数据只占一个字节,它只能存放0255范围内的整数。,例2.2 字符数据与整数进行算术运算。下面程序的作用是将小写字母转换为大写字母。,#,include,using namespace std;,int main(),char c1,c2;,c1=a;,c2=b;,c1=c1-32;,c2=c2-32;,coutc1 c2endl;,return 0;,运行结果为,A B,a,的,ASCII,码为97,而,A,的,ASCII,码为65,,b,为98,,B,为66。从,ASCII,代码表中可以看到每一个小写字母比它相应的大写字母的,ASCII,代码大32。,C+,符数据与数值直接进行算术运算,,a-32,得到整数65,,b-32,得到整数66。将65和66存放在,c1,c2,中,由于,c1,c2,是字符变量,因此用,cout,输出,c1,c2,时,得到字符,A,和,B(A,的,ASCII,码为65,B,的,ASCII,码为66)。,4.字符串常量,用双撇号括起来的部分就是字符串常量,如,abc,Hello!,a+b,Liping,都是字符串常量。字符串常量,abc,在内存中占4个字节(而不是3个字节),见图2.5。,图2.5,编译系统会在字符串最后自动加一个0作为字符串结束标志。但0并不是字符串的一部分,它只作为字符串的结束标志。如,coutabcendl;,输出3个字符,abc,,而不包括0。,注意:,a,和,a,代表不同的含义,,a,是字符串常量,,a,是字符常量。前者占两个字节,后者占1个字节。请分析下面的程序片段:,char c;/,定义一个字符变量,c=a;/,正确,c=a;/,错误,,c,只能容纳一个字符,字符串常量要用字符数组来存放,见第5章。,请思考:字符串常量,abcn,包含几个字符?不是5个而是4个字符,其中,“,n,”,是一个转义字符。但它在内存中占5个字节(包括一个,“,0,”,字符)。编译系统遇到,“,”,时就会把它认作转义字符的标志,把它和其后的字符一起作为一个转义字符。,如果,“,”,后面的字符不能与,“,”,组成一个合法的转义字符(如,c),,则在编译时显示出错信息。如果希望将,“,”,字符也作为字符串中的一个字符,则应写为,abcn,,此时字符包括5个字符,即,a,b,c,n。,如果有以下输出语句:,coutabcnendl;,则会输出:,abc,,然后换行。同理执行,coutI say Thank you!n;,的输出是:,I say Thank you!,如果在一个字符串中最后一个字符为,“,”,,则表示它是续行符,下一行的字符是该字符串的一部分,且在两行字符串间无空格。如,coutWe must study C /,本行最后的,“,”,后面的空格和换行均不起作用,+,hard!;/,本行的字符紧连在上一行最后的,“,”,前面字符之后,则输出:,We must study C+hard!,为了编程和阅读的方便,在,C+,程序设计中,常用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量。,例2.3 符号常量的使用。,#,define PRICE 30 /,注意这不是语句,末尾不要加分号,int main(),int num,total;,num=10;,total=num*PRICE;,couttotal=totalendl;,return 0;,2.2.4,符号常量,程序中用预处理命令#,define,指定,PRICE,在本程序单位中代表常量30,此后凡在本程序单位中出现的,PRICE,都代表30,可以和常量一样进行运算,程序运行结果为,total=300,请注意符号常量虽然有名字,但它不是变量。它的值在其作用域(在本例中为主函数)内是不能改变的,也不能被赋值。如用赋值语句,“,PRICE=40;,”,给,PRICE,赋值是错误的。使用符号常量的好处是:,(1)含义清楚。,(2)在需要改变一个常量时能做到,“,一改全改,”,。如,#,define PRICE 35,其实在前面的例子中已经多次用到了变量。在程序运行期间其值可以改变的量称为变量。一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念,见图,2.6,。,图,2.6,2.3,变量,2.3.1,什么是变量,先介绍标识符的概念。和其他高级语言一样,用来标识变量、符号常量、函数、数组、类型等实体名字的有效字符序列称为标识符(,identifier)。,简单地说,标识符就是一个名字。变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。,C+,规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。下面列出的是合法的标识符,也是合法的变量名:,sum,average,total,day,month,Student_name,tan,BASIC,li_ling,下面是不合法的标识符和变量名:,2.3.2,变量名规则,M.D.John,$123,#33,3G64,Ling li,C+,Zhang-ling,U.S.A.,注意,在,C+,中,大写字母和小写字母被认为是两个不同的字符。因此,,sum,和,SUM,是两个不同的变量名。一般地,变量名用小写字母表示,与人们日常习惯一致,以增加可读性。应注意变量名不能与,C+,的关键字、系统函数名和类名相同。在国外软件开发工作中,常习惯在变量前面加一个字母以表示该变量的类型,如,iCount,表示这是一个整型变量,,cSex,表示这是一个字符型变量。,C+,没有规定标识符的长度(字符个数),但各个具体的,C,编译系统都有自己的规定。有的系统取32个字符,超过的字符不被识别。,在,C+,语言中,要求对所有用到的变量作强制定义,也就是必须,“,先定义,后使用,”,,如例2.2和例2.3那样。定义变量的一般形式是,变量类型 变量名表列;,变量名表列指的是一个或多个变量名的序列。如,float a,b,c,d,e;,定义,a,b,c,d,e,为单精度型变量,注意各变量间以逗号分隔,最后是分号。,可以在定义变量时指定它的初值。如,float a=83.5,b,c=64.5,d=81.2,e;/,对变量,a,c,d,指定了初值,,b,和,d,未指定初值,2.3.3,定义变量,C,语言要求变量的定义应该放在所有的执行语句之前,而,C+,则放松了限制,只要求在第一次使用该变量之前进行定义即可。也就是说,它可以出现在语句的中间,如,int a;/,定义变量,a(,在使用,a,之前定义),a=3;/,执行语句,对,a,赋值,float b;/,定义变量,b(,在使用,b,之前定义),b=4.67;/,执行语句,对,b,赋值,char c;/,定义变量,c(,在使用,c,之前定义),c=A;/,执行语句,对,c,赋值,C+,要求对变量作强制定义的目的是:,(1)凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在声明部分写了,int student;,而在执行语句中错写成,statent。,如,statent=30;,在编译时检查出,statent,未经定义,作为错误处理。输出,“,变量,statent,未经声明,”,的信息,便于用户发现错误,避免变量名使用时出错。,(2)每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定和为,int,型,一般的编译系统对其各分配4个字节,并按整数方式存储数据。,(3)指定每一变量属于一个特定的类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量,a,和,b,,可以进行求余运算:,a%b,是,“,求余,”,(见24 节),得到,a/b,的余数。如果将,a,和,b,指定为实型变量,则不允许进行,“,求余,”,运算,在编译时会给出有关的出错信息。,允许在定义变量时对它赋予一个初值,这称为变量初始化。初值可以是常量,也可以是一个有确定值的表达式。如,float a,b=5.78*3.5,c=2*sin(2.0);,表示定义了,a,b,c,为单精度浮点型变量,对,b,初始化为5.78*3,对,c,初始化为2*,sin(2.0),,在编译连接后,从标准函数库得到正弦函数,sin(2.0),的值,因此变量,c,有确定的初值。变量,a,未初始化。,如果对变量未赋初值,则该变量的初值是一个不可预测的值,即该存储单元中当时的内容是不知道的。例如,若未对,a,和,b,赋值,执行输出语句,2.3.4,为变量赋初值,couta b cendl;,输出结果可能为,1.48544,e-38 15 1.81858 (,各次运行情况可能不同),初始化不是在编译阶段完成的(只有在第4章中介绍的静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。例如,,int a=3;,相当于以下两个语句:,int a;/,指定为整型变量,a=3;/,赋值语句,将赋给,对多个变量赋予同一初值,必须分别指定,不能写成,float a=b=c=4.5;,而应写成,float a=4.5,b=4.5,c=4.5;,或,float a,b,c=4.5;,a=b=c;,在定义变量时,如果加上关键字,const,,则变量的值在程序运行期间不能改变,这种变量称为常变量(,constant variable)。,例如,,const int a=3;/,用,const,来声明这种变量的值不能改变,指定其值始终为3,在定义常变量时必须同时对它初始化(即指定其值),此后它的值不能再改变。常变量不能出现在赋值号的左边。例如上面一行不能写成,const int a;,a=3;/,常变量不能被赋值,可以用表达式对常变量初始化,如,2.3.5,常变量,const int b=3+6,c=3*cos(1.5);/b,的值被指定为9,,c,的值被指定为3*,cos(1.5),但应注意,由于使用了系统标准数学函数,cos,,必须将包含该函数有关的信息的头文件,“,cmath,”,(,或,math.h),包含到本程序单位中来,可以在本程序单位的开头加上以下#,include,命令:,#,include,或#,include,变量的值应该是可以变化的,怎么值是固定的量也称变量呢?其实,从计算机实现的角度看,变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。对常变量来说,无非在此变量的基础上加上一个限定:存储单元中的值不允许变化。因此常变量又称为只读变量(,read-only-variable)。,请区别用#,define,命令定义的符号常量和用,const,定义的常变量。符号常量只是用一个符号代替一个字符串,在预编译时把所有符号常量替换为所指定的字符串,它没有类型,在内存中并不存在以符号常量命名的存储单元。而常变量具有变量的特征,它具有类型,在内存中存在着以它命名的存储单元,可以用,sizeof,运算符测出其长度。与一般变量惟一的不同是指定变量的值不能改变。用#,define,命令定义符号常量是,C,语言所采用的方法,,C+,把它保留下来是为了和,C,兼容。,C+,的程序员一般喜欢用,const,定义常变量。虽然二者实现的方法不同,但从使用的角度看,都可以认为用了一个标识符代表了一个常量。有些书上把用,const,定义的常变量也称为定义常量,但读者应该了解它和符号常量的区别。,C+,的运算符十分丰富,使得,C+,的运算十分灵活方便。例如把赋值号(=)也作为运算符处理,这样,,a=b=c=4,就是合法的表达式,这是与其他语言不同的。,C+,提供
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服