《高级语言程序设计:chap04 常量、变量和类型构造》由会员分享,可在线阅读,更多相关《高级语言程序设计:chap04 常量、变量和类型构造(78页珍藏版)》请在金锄头文库上搜索。
1、第四部分 常量、变量和类型构造Constants, Variables & Data Type Constructing本部分内容n介绍高级语言中常见的各种常量n数字常量、字符常量、字符串常量、符号常量、枚举常量的表示或定义方法n变量n概念,定义方法,命名规则或规范nC语言变量的赋值、初始化和使用n变量的属性n指针变量n构造数据类型的基本概念n一维数组、字符数组n二维数组初步概念、定义和使用方法n结构体n联合n运算是计算机程序的各种计算操作n数据是程序的运算对象n与代数运算表达式相仿,高级语言中的运算对象也分为常量和变量,常量和变量都可以出现在表达式中,如ny = x + 5;n复杂的运算或操
2、作n打开一个图片n新开一个账户运算与运算对象一、常量constant1. 常量的概念和分类n常量n程序中直接给定n值在程序运行过程中不可以改变的量。n各种常量n数字常量n字符常量n字符串常量n符号常量n枚举常量常量举例与讨论n圆周率?光速?n标准操作内圈长度n汉字“二”所代表的含义?n某在线系统中的允许的最大并发用户数n某类QQ群允许的最多成员数n航空航行团成团最少人数n有可能会在多种场景下出现的完全一样的错误的编码与提示信息?n一个星期的天数n英文各月份的标准拼写与缩写n月份NOV与DEC分别所代表月份及他们之间的间隔n英文字母的个数计算机软件系统中,哪计算机软件系统中,哪些量常需要设成常量
3、?些量常需要设成常量?2. 回忆数字常量n数字常量n表示参与计算的数值,既可以是整数,也可以是带小数的实数。n整数表示方法n十进制 如:90、255n八进制(以0开头)如:0123n十六进制(以0x开头) 如:0x5a、0x23ffn实数表示方法n整数部分或小数部分为0时,可以不写数字0,如以下表示如:0.12 .23(0.23) 1.45 4.9 6.(6.0)n科学表示法如:0.12E3 5.6E-6 -7.6E12n单精度实数表示如:4.5f 6.3F 0.123E3f 5.6E-6F实数类型默认为双精度实数3. 回忆字符常量n定义n用一对单引号知起来的单个字符n字符分类n可见字符 如:
4、字母、数字、标点等。n不可见字符 如:控制光标移动、使终端发出振铃声音的各类字符。n表示 如:0 z n t换行符横向制表符(Tab)字符换码序列换码序列 含义 换码序列 含义 a 响铃符 v 纵向制表符 b 退格符 反斜线 f 换页符 ? 问号 n 换行符 单引号 r 回车符 ” 双引号 t 横向制表符4. 回忆字符串常量n定义n用一对双引号(“)引起来的0个或多个连续的字符,但不包括双引号。n当字符串中包含双引号时,需要用”来表示。n举例n“This is a stringn”n“” is a double quote”n在计算机中存储时以空字符0结束,但在字符串常量中不需要直接表示这个空
5、字符。字符串中可以包含换行符表示双引号5. 符号常量n符号常量:用符号代表一定的常量n符号可以是任意的合法标识符,但习惯使用大写字母和下划线组成的标识符。n用宏命令#define定义符号常量n#define PI 3.14159265375n也可以定义常量表达式 #define TIMES (NUM/4)n优点n有助于提高程序的可读性n便于记忆和使用n有助于发现和减少程序中的错误n提高程序的可维护性最好根据常量的用途和含义对常量命名是一个编译预处理命令,它所定义的符号常量在预编译阶段被替换为对应的字符串。必须是已定义过的符号常量例/计算并输出半径为2.5米的圆的面积#define PI 3.1
6、4159265375main() printf(“Area = ”, PI * 2.5 * 2.5); return 0;6. 枚举常量n定义n枚举常量是一种用符号表示的整型数字常量,且有标识符表示。n使用关键字enum定义nenum A, B, C, D, E = 50, F, G, H, I;nenum JAN = 1, FEB, MAR, APR, MAY, JUN, JLY, AUG, SEP, OCT, NOV, DEC;n如果枚举常量后面给定了值,则以给定值作为枚举符对应的常量值。n当枚举符后面没有给定值,只是一个标识符时,该枚举常量的值等于其前面枚举常量的值加1。如果该枚举常量是
7、一个标识符时且没有给定值,该枚举常量的值等于0。枚举量与符号常量的意义n用文字符号的形式表示常量有利于更好地理解程序意义。n例如,程序里两个0可能会代表不同意义,它们在数值形式上没有任何区分。但是,采用符号常量可提高可读性,便于理解。n高级语言提供了用符号表示常量的办法,在程序中统一使用。n好处n使程序更容易修改和阅读二、变量及其属性1. 变量概念、定义和使用n变量n程序运行过程中可以发生变化的量n存储数据的命名对象(变量名)n变量名是标识符。n使我们在程序中能通过一个名字来使用存储单元n变量的特点n变量能保存值,不会丢失。给某变量名是标识符。n变量的值可以变化n变量赋一个值之后,每次使用它总
8、得到这个值,直到下次赋值。n对变量基本操作n赋值(写)n取值(读)注意:要遵循命名规范2. 变量的类型和定义n变量有固定的类型,只能保存这个类型的值。n整型变量(保存 int值的变量)n双精度变量(保存 double 值)n字符变量,n变量定义n变量必须先定义后使用n需要给出变量名和类型。n例nint m;ndouble x;n可以同时定义多个同类型的变量nint k, n, sum, count;nlong double y, z;为什么要给出类型?不给行不行?有不给的吗?能定义一种变量存什么数据都行吗?3. 变量的命名n关键字不能当做变量名n变量的命名最好能反映变量的实际含义n一些行业规范
9、里,变量命名一般还应反应变量的类型,有些变量命名还要反应变量的地位(如类属性、全局变量)n变量命名要求参见编码规范4. 复合结构内的局部变量n复合结构中可以定义局部变量,在内部使用n变量定义应出现在所有语句之前变量定义序列语句序列n有些C+没有这个要求n一个复合结构里不能定义多个同名的变量。5. 变量的取值与赋值n取值:计算中遇到变量,取其值参与计算nx + sin(3.2 * y) - pow(x, 2)n赋值n用赋值运算符(=,赋值号)表示n赋值语法nVariable = Expression /赋值表达式nx = 5.0n左边是赋值目标,右边是提供值的表达式n赋值运算的主要效果是把表达式
10、的值赋给左边变量n赋值运算符优先级很低。n例nx = 2 + 3 * y赋值语句n赋值语句nVariable = Expression;n最基本的语句,完成程序里最重要的操作n程序中一般用赋值语句描述赋值动作n例n重写由三边求三角形面积的程序n计算中多次用半周长,定义变量保存这个值,可避免重复计算。n变量的最主要用途:量的最主要用途:保存保存计算的中算的中间结果果#include #include int main () double s; s = (3. + 5. + 7.) / 2.; printf(Area: %fn, sqrt(s*(s-3.)*(s-5.)*(s-7.) ); ret
11、urn 0;用于保存中间结果n一个非常重要的思想:一个非常重要的思想:预先计算保存计算的中预先计算保存计算的中间结果,以提高效率。间结果,以提高效率。预计算省去重复计算,提高效率问题:问题: 可能会有相当多的人提交类似或完全相同的搜索需求?可能会有相当多的人提交类似或完全相同的搜索需求?怎么办?如何提高效率?怎么办?如何提高效率?解决办法:解决办法: 整理搜索需求,为这些相同的搜索整理搜索需求,为这些相同的搜索提前计算提前计算好搜索结果,好搜索结果,并做周期性的更新计算,以提高搜索服务效率,提高用户并做周期性的更新计算,以提高搜索服务效率,提高用户体验。体验。赋值表达式的值与结合性nVaria
12、ble = Expression 整体上被称为赋值表达式n赋值表达式也有值,就是右边表达式的值。n赋值表达式的值通常不用,但赋值表达式的值也可以用,例n y = (x = 5) + 8;n有时可以用同一表达式为多个变量赋值。ny = (z = (x = 1.0);n赋值运算符的结合律n从右向左结合y = z = x = 1.0;简化赋值与类型n给定赋值表达式nVariable = Expressionn左边变量和右边的表达值都有类型n规定n若表达式值与被赋值变量类型不同,该值先转换到变量类型的值,然后赋值。n在前面程序例子里把赋值语句改写成:ns = (3 + 5 + 7) / 2;n运行时发
13、现程序的结果不对,为什么?6. 变量初始化n定义变量时指定变量的初始值。n可用数值或者数值表达式为变量做初始化,如ndouble s = (3 + 5 + 7) / 2.0;nlong double x = 4.5L, y = 3.24L;n初始化只能一次对一个变量做7. 从键盘输入数据到变量n请查阅并预习scanf语句的功能与用法n例#include “stdio.h”main() int n; scanf(“%d”, &n); printf(“输入的值为:%d”, n); return 0;%d表示输入整数,请先自学%c, %s, %lf, %f的含义&n表示录入的数转换成整数后放入n中8
14、. 赋值符与等于n赋值与数学中的“等于”完全不同。n例nx = x + 1;n“x = x + 1”在数学里为矛盾。nC语言中判断两个值是否相等,用运算符n=n一定注意不要写成一个等号9. 值的计算顺序问题n下面是合法语句nx = 2.0;ny = (x = 3.0) + x;n问题:n执行后y 的值是什么?n这个问题没有明确答案,因为第二个语句没有语法错误,但是定义不明确。n原因nC语言未规定加法对两个运算对象的求值顺序,这种表达式的结果没有定义。dValue35.7变量double类型名字变量的存储单元地址:0x00002f30 10. 变量的属性图示规定存储的长度和格式double dV
15、alue = 35.7;请大家完全理解本图。请大家完全理解本图。三、指针变量简介从信件投递、找人、找地方到找存储空间,保存存储空间地址的方法指针变量简介1. 找到目的地的办法某宿舍宿舍号某办公室通信地址同学或快递根据宿舍号找到宿舍快递或邮局根据通信地址投递北京交大我校地址根据地址找到学校网站地址网站通知书上网站上脑子里信封上信封上或脑子里搜索结果上脑子里手册上目的地地址地址保存处根据地址找到网站2. 回忆数据与存储空间0100000100000000000000000000000000000000存储空间:以字节为单位编号普通字符型变量占8位A一个32位int占用的存储空间一个float型浮点
16、数所需占用的存储空间0x000000000xFFFFFFFF存储空间的编号称为地址0x000000010x000000023. 存储空间地址之用处n日常生活中的地址的用处n找到目的地,在目的上开展活动n存储空间地址用处n找到相应的存储空间n就可能可以访问存储空间n往其中存数据;n使用其中保存的数据。4. 地址编排、分配与获得n日常生活中的各种地址编排与分配n你们每个人是如何得到宿舍地址的?何时得到,谁负责分配给你们使用的?还有谁知道你们住在什么地方?n房产商的房子,谁负责编号?你会根据什么看楼盘户型?购买合同中是否需要明确地址?n你在学活申请小会议室开会,如果成功,受理部门会给你一些什么信息?
17、n你在学校体育馆定羽毛球场地,成功后,谁会给你什么样的信息?计算机中内存地址获取途径n存储空间地址获取途径n用&运算符取已知变量所占用的存储空间地址,变量的地址是由谁编排的?n使用存储空间申请功能向操作系统成功申请存储空间后,相应功能会返回得到的存储空间地址。(此部分内容见后续部分讲解)n直接使用一些地址常量,如数组的起始地址5. &运算符说明示例nint n = 10;n则&n代表整型变量n所占用的存储空间的起始地址。n如图所示,设n占用了0x0012FF70-0x0012FF73这4个字节的存储空间n则&n的值为n0x0012FF70100x0012FF70n内存空间6. 存储空间地址与保
18、存n计算机中的内外存的存储空间非常大,可以保存大量的不同类别、不用形式的数据。n要对这些数据进行管理、使用和处理,必须记录下这些数据所处的存储位置地址,否则无法找到这些数据。n在许多高级语言中,提供一类用来记录存储空间地址的变量,这种变量一般被称为指针变量。n注意,因为通过对保存在指针变量中的地址来直接操作存储空间需要程序员的细心和经验,否则,一些地址值算错就容易使程序出错。因此,也有一些高级语言如JAVA不再设置指针变量,而通过其它机制实现动态存储管理。6. 指针变量n指针变量n用于保存某种类型的存储空间的起始地址的变量。n语法: 基类型 * 变量名;n例nint *pInt;ndouble
19、 *pDouble;nchar *pChar;7. 指针变量的常见用法示例n示例1nint n;nint *pInt;npInt = &n; /取n的地址放在pInt中n示例2nint *pInt;npInt = (int *)malloc() /申请一块存储空间并将其地址存入pInt中;n示例3nint *pInt, narr10; /narr为一个数组npInt = narr; /使pInt中保存数据的起始地址8. 间接运算符*n指针的间接运算符: *n如给定表达式*pInt,表示先取指针变量pInt中所存的地址值addr,然后再将addr所处的整型存储空间中的值取出来作为表达式的值。n如
20、nint n = 100, m, *p;np = &n;nm = *p + 1; /m的值将为1010X0012FF701000X0012FF700X0012FF68pn1010X0012FF6Cm9. 指针变量与存储单元关系图示0X0012FF78指针变量p1550X0012FF78100X0012FF70550X0012FF78每格代表4个字节int *p1;int n = 55;int *p2;int m = 10;p1 = &n;p2 = &m;0X0012FF700X0012FF740X0012FF780X0012FF7Cmp1p2n*p1的值为55,*p2的值为10问,执行 *p1
21、 = 100;会产生什么影响?东东1宿舍楼宿舍楼东东2宿舍楼宿舍楼东东2宿舍楼宿舍楼东东4宿舍楼宿舍楼东东1宿舍楼宿舍楼1层层东东1宿舍楼宿舍楼2层层东东2宿舍楼宿舍楼3层层东东2宿舍楼宿舍楼1层层东东1宿宿101东东1宿宿102东东1宿宿501东东1宿宿510东东1宿宿101-1床床东东1宿宿101-2床床东东1宿宿101-1床床东东3宿宿501-2床床主校区主校区东校区东校区分析各类位移的区别分析各类位移的区别结论结论1:地址是有类型,有层:地址是有类型,有层次的次的变变1变变1变变2变变1变变9变变1变变x结论结论2:空间变换的绝对位移距:空间变换的绝对位移距离与地址的类型有关离与地址的
22、类型有关变变1变变210. 指针变量的类型n指针变量中保存的是某种类型存储空间的地址n存储单元的地址值是有类型的,如n存储int值的存储单元的地址的类型是 int *n存储double值的存储单元的地址的类型是double *n存储char值的存储单元的地址的类型是char *n不同类型值存储单元的地址值属于不同的类型nint * 和 char *属于不同的类型ndouble * 和 int * 属于不同的类型nshort * 和 long * 属于不同的类型n地址值类型的不同意味着不能将类型不同的地址值赋给基类型不同的指针变量。四、构造数据类型Constructed Data Types简单
23、数据类型复杂数据类型1. 复杂数据类型描述的需求n如何描述一组类型相同的数据?n如何描述图片?n如何描述游戏中对象,如武器、战场?n如何描述一个身份证?n如何描述学籍管理系统中的学生?n如何描述地图?n如何描述一个围棋棋盘?n如何描述搜索引擎的搜索结果?n2. 复杂数据类型的特点n数据不是孤立的,数据之间可能具有关系n一个对象可能具有一组类型相同的数据n一个对象可能具有许多不同的属性n例n给定一组关键词,可以在搜索引擎上搜索到很多搜索结果n一个自然人具有许多不同的属性n一个班级里具有许多学生n一个课堂上既有教师也有学生3. 构造数据类型n构造数据类型n根据已定义的一个或多个数据类型用构造的方法
24、来定义新的数据类型。n也就是说,一个构造类型的值可以分解成若干个n“成员”(component)或n“元素”(element)n每个成员或元素都是一个基本数据类型或又是一个构造类型。4. 同类型数据集合的描述办法n给定一个集合S = e1, e2, , en,如何用高级语言去描述和使用这样的集合?n最简单的办法:数组arrayn一段连续的存储空间,存储空间被顺序分成N个存储单元,用于存储一组相同元素,每个单元只存储一个元素,最多可以存N个n考虑n如何摆脱元素个数限制n不一定非得在内存里挨着放n其它表示办法:链表、树、图、5. 具有许多属性的对象描述办法n给定现实世界中的一类对象(Object)
25、,设其具有属性集AS = a1, a2, , an,如何去描述这样的对象?如:n对于人,具有姓名,出生日期,身份证号,籍贯,民族等属性,如何表示?n在各种高级语言中都提供了不同的表示办法nC语言中的structnPASCAL中的recordn各种面向对象程序设计语言中的class等五、数组array数组的重要意义: 以统一的方式描述一组同类型数据的对应的连续存储空间,从而为方便地对一组数据实现统一的数据处理奠定基础。1. 数组的概念、分类n概念n数组是一种构造类型,它是由具有同一种更基本类型的数据按顺序组织在一起的有序整体;n数组中的元素通过下标来索引(indexing);n每个数组元素可以当
26、成一个普通变量使用。n按维(dimension)数分类n一维数组n二维数组n三维数组n更高维数组2. 数组的定义n一维数组定义语法 n ;n如nint a50; ndouble b322;nint c=1,2;n二维数组定义语法n MNn如nint a34;nint days7=1, 2, 3, 4, 5, 6, 7, 0, 3, 5, 7, 9, 2, 1;元素个数必元素个数必须是常量须是常量3. 数组元素编号及存储a0 a1a2 an-2 an-1 n每个元素的类型都相同n每个元素的类型可以任何合法的类型(基本类型、数组、指针、结构、)n每个元素在内存中按编号顺序紧挨着连续存放C的数组元素
27、编号规则(i = 0 n-1),首元素序号为0,依次类推顺序编号,i称为下标。4. 多维数组的定义nint nArr100;nint nTwoDimArr105; 也可以看是一维数组nint nThreeDimArr356; 也可以看成是一维或二维数组5. 数组的基本使用规则n访问某个数组元素用下标运算符,其优先级最高,运算对象是数组名和括号里表示下标的表达式。n一维数组使用举例int narr10, i;i = 5; narri = 20; /将第5个元素置成20012345678920n二维数组使用举例int nTwoDimArr105, i, j;i = 0;j = 2;nTwoDimA
28、rrij = 100; /将第0行第2列的元素置成100012340123456789ij1006. 数组名称与数组元素地址计算nC规定,数组的名称代表数组的起始地址值。n若有定义: int narr10;n则,narr代表整个数组的起始地址。n取数组元素的地址的方法为在数组元素前加&,如n&narri 表示取数组第i个元素的地址n对于该数组中的第i个元素,narri的地址为nnarr + i * sizeof(int)nsizeof用于获取其中的类型或变量的大小。n即假设narr的值为1000,sizeof(int)为4n则narr3的地址1000 + 12 =1012,即表达式&narr3
29、的值为1012。六、结构体struct具有多个属性的对象的描述办法1. C的结构体及定义n结构体n将事物或事件的不同属性组织在一起作为一个整体来对待。n结构体是面向对象程序设计中的类的基础。n结构说明由struct引导,有二种基本形式nstruct 成员说明序列 ;nstruct tag member-list declarators;nstruct 类型标记 成员列表 变量声明;2. 实例n校园一卡通系统需要描述每一个用户的如下信息n用户ID,姓名,身份证号,性别,卡余额n其中n用户ID为14位学号n姓名不超过10汉字n身份证号18位n性别用M和F表示男女n卡余额为双精度浮点数。实例结构体说
30、明struct UserAccount char szUserNO15; char szName20; char szID19; char cGender; double dBalance; User, Users100, *pUser;struct UserAccount char szUserNO15; /用户ID char szName20; /姓名 char szID19; /身份证号 char cGender; /性别 double dBalance; /卡余额;struct UserAccount User, Users100, *pUser;User为一个普通的结构体变量;Use
31、rs是一个长度为100的结构体数组;pUser是一个指针变量,用于存放该类型结构体变量的所占存储空间的地址;实例图示用户ID姓名身份证号性别卡余额08120001 张帅帅110108M0.10结构体类型结构体实例化08120099 李美美350108F500.00struct UserAccount char szUserNO15; char szName20; char szID19; char cGender; double dBalance;struct UserAccount User, Users100, *pUser; 3. 结构体数组08120001081200990812000
32、708120007 张帅帅 李美美 赵小飞 罗小花110108350108360108410108MFMF0.10500.0020.0088.20长度为n的结构体(记录)数组,其中每个元素是一个结构体(记录)4. 结构体的使用规则n访问结构体成员,分量运算符. .n结构体变量.结构体成员n例如User.cGender = F;User.dBalance += 10.2;printf(%15s %20s %19s %c %10.2lfn, User.szUserNO,User.szName, User.szID, User.cGender,User.dBalance);通过结构体指针访问成员n结
33、构体指针变量用于存放结构体的地址n结构体变量的地址等价于第一个成员的地址n对于前面的定义,若令pUser = &Users5;n则pUser将保存结构体数组中的第5个元素的地址n方法1:通过间接运算符*n(*pUser).cGender = M;n(*pUser).dBalance = (*pUser).dBalance + 9.5;n*pUser表示pUser所指向的结构体n加括号的原因n分量运算符.的优先级高于间接运算符*,不加括号会编译器会认为pUser是一个结构体,报出语法错误n通过括号先执行间接运算,这种方式比较麻烦通过结构体指针访问成员n方法2:通过结构体指针变量访问结构体,使用-
34、运算符n例pUser-cGender = M;pUser-dBalance += 11.5;printf(%15s %20s %19s %c %10.2lfn, pUser-szUserNO, pUser-szName, pUser-szID, pUser-cGender, pUser-dBalance);七、联合Union1. 定义nunionn形式与struct类似,但是实质有很大的不同n提供一种若干个不同的名字共享(共用)一段存储空间的手段,但是同一时刻只有能一个名字有实际意义。n如如union data int n; double x; char c;使用方法与结构体类似,区别在于所有
35、成员共享同一段固定长度的存储空间联合变量的存储实现n成成员共用同一存共用同一存储位置,存位置,存储区大小由大成区大小由大成员决决定。定。对union data,n是整数,是整数,d是双精度数,是双精度数,c是字符。需要足以存放双精度数的存是字符。需要足以存放双精度数的存储区。成区。成员安排如下安排如下图:联合变量的初始化和使用n联合变量可以在定义时直接初始化,但这个初始化只能对第一个成员做。n例union data u1 = 3, u2 = 5;n联合变量使用形式与结构变量相同,可整体赋值、成员访问、取地址。如:n = u1.n;u1.c = n;m = u2.n + 167;n可定义指向联合
36、的指针,可从这种指针出发,通过-运算符访问被指联合变量的成员。八、数据类型总结从细到粗,从微观到宏观,从具体到抽象的一个过程1. 说明实例struct Student char szStudentID9; /学号 char szName20; /姓名 int nAge; /年龄 char cGender; /性别 double dHeight; /身高Students10;设Students5相关数据为:“09120001”,“Johnson”, 18, M, 175.5长度为10的学生信息数组,如何解读?2. 从粗往细解读0195“09280001”“Johnson”18M175.50 9
37、2 8 0 0 0 1 00 0 1 1 1 0 0 10 0 1 1 0 0 0 00, 0x30, 489, 0x39, 57J o h n s o n 000 1 0 0 1 0 1 0 J, 0x4a, 740 1 0 0 1 0 1 0h, 0x68, 1040000000 00 0 0 0 1 0 0 1 00x00000012, 1800010010 00 0 0 0 0 0 0 001 1 0 1 1 0 1M, 0x4d, 770x40 65 F0 00 00 00 00 000 100 0000 0110 0101 1111 000+, 1030-1023=7, (1.01
38、011111)B= 1.37109375(-1)0*27*1.37109375 =175.5按微机字节序存储,低位在前高位在后参见IEEE 754标准Students10字符数组3. 数据类型总结二进制01010011基本数据类型(unsigned)int、(unsigned)short int、(unsigned)long int、实型(float、double)、(unsigned)char构造数据类型数组类型、结构类型、联合类型、指针类型等位字节基本数据类型构造数据类型本部分应掌握的内容n常见的各种常量的表示和定义方法n变量n概念,定义方法,命名规则或规范nC语言变量的赋值、初始化和使用n指针变量基本概念n掌握数组的概念、定义和简单使用方法n构造数据类型的基本概念n数组基本概念n结构体基本概念本部分结束