零点起飞学c++之数据的指代——变量和常量

上传人:wt****50 文档编号:49551186 上传时间:2018-07-30 格式:PPTX 页数:43 大小:227.79KB
返回 下载 相关 举报
零点起飞学c++之数据的指代——变量和常量_第1页
第1页 / 共43页
零点起飞学c++之数据的指代——变量和常量_第2页
第2页 / 共43页
零点起飞学c++之数据的指代——变量和常量_第3页
第3页 / 共43页
零点起飞学c++之数据的指代——变量和常量_第4页
第4页 / 共43页
零点起飞学c++之数据的指代——变量和常量_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《零点起飞学c++之数据的指代——变量和常量》由会员分享,可在线阅读,更多相关《零点起飞学c++之数据的指代——变量和常量(43页珍藏版)》请在金锄头文库上搜索。

1、第3章 数据的指代变量和常量 变量和常量用来保存数据,变量中保存的 数据经常改变,常量则相反。变量方便数 据的操作,常量增强程序的可读性和可移 植性。本章将对他们进 行详细讲 解。3.1 指代可变的量变量 变量就是内容可变的量。它是访问 和保存 数据的媒介,为程序提供了操作数据的方 便性。它在程序中的应用非常频繁,只有 正确、灵活地使用它才能编写高效的程 序。不使用变量的程序也是可以编写出来 的,但却不会有什么实用价值。本节就来 详细 地讲解变量的含义和使用。3.1.1 什么叫变量 要理解什么叫变量,首先要知道数据在计 算机上是怎么存放的。当程序运行时,所 需的数据要放在内存中才能使用。内存又

2、 被格式化成一个个小的存储单 元,数据就 保存在这些存储单 元内。为了访问这 些数 据,就必须给 内存中的存储区域命名,用 标识 符来标志它。如果该存储区域存放的 数据不仅可以读取,还可以被修改和写入 ,那么该标识 符就叫变量。下面将从4个方 面来讲解变量的使用。1变量的定义 变量不仅向编译 器宣告变量的存在,而且 同时为 它分配所需的存储空间。其格式如 下所示。 type var1=value1,var2=value2,; 其中,type是一个类型名,可以是int、char、 struct、union等任何类型说明符,它决定了变 量的性质和行为。var1和var2是变量的名字, 可以是任何合

3、法的非保留字标识 符。中括号表 示括号内的内容可选,value1和value2是一个 常量值,目的是给var1和var2赋初值。如果同 时定义多个变量,则这 些变量间必须用逗号 “,”隔开。最后一个变量后跟一个分号“;”,因 为变 量定义也是一条语句。 变量的类型决定了怎么去理解和操作该变 量所对应 的数据。变量名为程序提供了内 存块的首地址和操作它的媒介。下面就来 看一下5个变量的定义方式。【示例3-1】2变量的声明 如果只是向编译 器说明将有一个变量存在 ,而不为它分配所需的存储空间,就叫变 量的声明,它仅起占位符的作用。其格式 如下所示: extern type var1,var2,;

4、其中,extern是C+的关键字,表示这里定 义的变量是“外部”的。外部是指变量要么 在另一个文件内,要么在本文件后面某 处。总之就是先使用,后定义。用关键字 extern声明一下变量,可以避免编译时报 告变量不存在的问题 。【示例3-2】 使用extern声明一个来自其他文件的变量, 以及一个在主函数后才被定义的变量。 分析:变量a和b被声明为外部变量。其中 ,a在头文件a_here.h中有真正的定义,b则 在main()函数的末尾有定义,c则是一个定 义。 若在变量声明的时候赋了初值,即使有 extern保留字,它也表示定义而非声明。 extern int a=1; 警告:如果用exter

5、n声明了某个变量,则 必须确保这个变量真的存在于其他文件中 ,并被#include指令包含进来,或真的存在 于本文件的后面某处。否则,即使编译时 通过,链接时也会报错 ,提示变量不存 在。3变量的存储位置 变量会依据定义的位置和方式来决定保存数据 所需内存空间的位置。 如果变量定义在函数体内,且无static修饰, 则该变 量将从堆栈中得到存储空间。当程序 执行进入函数后,才为变 量分配存储空间。 退出后,自动释 放分配的空间。 如果变量定义时 被static修饰,则无论是在函 数体内还是函数体外,都将从全局空间中得到 存储空间。 如果变量定义在函数体外,则在全局空间中 得到存储空间。【示例3

6、-3】 演示5个变量的定义和存储方式间的关 系。 分析:变量d1、d2和s1定义在函数体外, 所以存储于全局内存中。ch虽然定义在函 数体内,但有关键字static修饰,所以也放 在全局内存中。s2在函数体内定义又无 static修饰,所以将从堆栈中得到存储空 间。4变量蕴含的信息 对于每一个变量,都有两个信息与其相关 联。 数据值:变量的数据值就是存储在变量对应 的存储单 元中的数据,也叫“右值”。右值是 指被读取的数据,即在赋值 运算符的右边, 代表的是数据。 地址值:变量的地址值就是变量对应 的存储 单元的首地址,也叫左值。左值是指被写入 ,即在赋值 运算符的左边,代表的是地址。 在示例

7、3-3中,变量d1在“d1=3.14;”中是左值, 被写入;在语句“d2= d1”中是右值,被读取。 在“d1=d1+d2;”中,则同时作为右值和左值。3.1.2 种类 由于程序的各种需求,变量的性质多种多 样。1按变量的作用域来划分 按作用域分,可以将变量分为局部和全局两种。 局部变量也叫自动变 量,在函数内部或函数参数中 定义,存储在堆栈中。它在程序进入函数时才分 配空间,退出时就释放。因此,不同的函数内可以 有相同名称的局部变量。有时,在函数内部的某个 由大括号界定的语句块内也需要定义局部变量, 这种局部变量的作用域更小,仅限于块内。 全局变量则定义在函数外部,存储在固定的存储 区域内,

8、具体由编译 器来决定。它在程序的生存期 内都有效,除非手工释放,否则直到程序运行结束 才释放所占空间。因此,全局变量绝对 不能重 名。2按变量的数据类型划分 按变量的数据类型划分,可以分为整型、 浮点型、字符型、结构体型,以及逻辑 型 和枚举型等多种。这种划分法的种类由语 言所能识别 的数据类型决定。3按变量的存储位置划分 按变量的存储位置划分,可以将变量分为全局空 间、堆栈空间和寄存器3种。 全局空间变 量就是全局变量,这类变 量存储在某 一固定区域内,全程有效。用extern关键字声明的 变量就属于全局空间变 量的一种。 堆栈空间变 量是局部变量,存储在函数自有的堆 栈空间内。 寄存器变量

9、就是数据保存在CPU的寄存器内的变量 ,用关键字register说明,它也是局部变量,仅限于 整型和字符型。由于寄存器变量的数据直接放在寄 存器内,所以操作速度很快。但计算机的寄存器数 量很少,因此不能定义太多,也不能长久占据。4按变量的存储方式划分按变量的存储方式划分,可以分为静态和动态 两种。静态变 量用关键字static说明,在程序所占据的数据段(Data Segment ,在内存中某处保留的一段大小固定的空间)内分配永久存储 空间,整个执行过程中都不释放。静态变 量又可分为静态局 部变量和静态全局变量。 静态局部变量只在定义它的函数或语句块内有效,只在第一次 调用时定义,以后每次调用函

10、数时都不再重新定义,仍然保 留上次函数调用结束时的值。因此静态局部变量是有记忆 的。 静态全局变量只在定义它的文件内全程有效的,在整个运行期 间均存在并且保持原来的存储单 元位置不变。因此不能用 extern关键字从其他文件中引用静态全局变量。 动态变 量用关键字auto说明,auto常可省略。动态变 量的赋值 是在函数调用时进 行的,每调用一次就重新赋值 一次。 技巧:如果需要保留函数内变量的值, 又不想以参数或返回值的形式传递 数据, 这就需要把变量定义成static类型。此时变 量存储于全局内存中,而函数调用结束时 ,释放的是自己的堆栈内存,所以下次调 用该函数时,该值 仍然有效。但要明

11、白, 它的作用域仅限该函数内。【示例3-4】 给出5个变量,每个变量都属于不同的种 类。 分析:该示例中定义5个变量。其中,a是 全局变量,可以被引出到其他文件中。b是 从外部引入的,也是全局变量。c是静态全 局变量,只在本文件内有效,不能引出到 其他文件中。d是用extern声明的全局变量 ,其定义在main()函数后。g是一个寄存器 变量。3.1.3 初始化 初始化指第一次给变 量赋值 。可以是在变量 被定义时 就进行,也可以是在定义后再初始 化。当变量被定义后,就在内存中给它分配 了一块存储单 元,用于存放数据。这块 存储 单元有可能从本次打开机器以来一直没有被用 过,也有可能曾被用过至

12、少一次。不管怎样 ,在将该内存单元分配给变 量时,它都可能 包含任何预料不到的数据。因此,如果直接使 用没有初始化过的变量,任何难以预料的情 况都可能发生,或者是数据越界,或者是堆栈 溢出等。初始化所用的数据应该 是该种类型 数据中最常见的,以免引起歧义和理解上的困 难。【示例3-5】 演示变量的初始化方法。 分析:该示例共定义5个变量。其中,a在需要时才 初始化;b和c在定义中就初始化;d是定义后立即 初始化。前4个变量的初始化并不会引起过多的歧 义,也不会导致阅读 困难。但是后两个变量e和f的 初始化就令人觉的诡异得多,除非真的需要这样 的 数据,否则不要这么初始化。 注意:寄存器变量操作

13、速度很快,但是register修 饰符仅是请求,而非指令。因此,如果没有可用的 寄存器,它修饰的变量将仍可能还是自动变 量, 还要在内存中得到存储空间。3.1.4 变量的命名规范变量是标识符,所以变量的命名遵循C+中关于标识符命名的一切规范,还 有作为变量名字的一些习惯。具体如下: 由字母(大写AZ或小写az)、数字(09)和_(下划线)组成。 不能包含除下划线“_”以外的任何特殊字符,如%、#、逗号、空格等。 不能包含换行符、空格和制表符等空白字符。 不能包含保留字,如int、main、return等。 区分大小写,如temp、Temp以及TEMP等都是不同的变量。 变量的长度不受限制,但系

14、统只取前1024个字符有效,C是前8个有效。 变量名由字母或下划线开始,后跟若干字母、数字和下划线的组合,如_data 、temp1、temp_1等。 变量名尽量有意义,以提高程序的可读性。例如,用temp表示临时变 量,用 area表示面积等。 如果变量名含有一个以上的单词,则要么单词的首字母都大写,要么单词 间用下划线隔开。 习惯上用小写,如temp、left等。 前7条为标识 符的命名规范,后3条属于变量的命名习惯。3.2 指代不变的量常量 常量就是内容不变的量。它可以用来保存 在程序中频繁使用但内容却不需改变,或 者程序中用到的众所周知的常数(如圆周 率,阿伏伽德罗常数,万有引力常数等

15、 )。将这些数据定义为 常量可以增强程序 的可移植性和易读性。本节将详细 地讲解 常量的概念和使用方法。3.2.1 什么叫常量 生活中,有很多数据是恒定不变,或者一 段时间 内恒定不变,或者假定为不变的, 这样 的数据就被称为常数。虽然可以在程 序中直接使用它们,但是频繁地写同一个 数据,不仅容易出错,而且也不直观。因 为无法从数据本身看出这些数据到底是什 么意思。例如下面这些例子:3.1415926,365,6.021023,2.99792485E8,100如果这些数出现在程序中,很难分辨它们到底是什么意思。第 一个和第二个尚且容易些,分别是圆周率和一年的天数,但是 后面的就不那么容易了。它

16、们分别是阿伏加德罗常数和真空中 的光速。最后一个数就显得很诡异,大概谁也猜不出它究竟表 示什么。它或许表示字符串的最大长度,或许表示允许输 入的 最多数据量,这些猜测都有可能。 程序中直接使用这些数字,就被称为“魔数”,将会导致程序的 可读性变差。程序员自己也会忘记那些数字或字符串是什么意 思,用户则 更加不知所云。而且如果需要在程序的很多地方输 入同样的数字或字符串时,难保不发生书写错误 。如果这些 数据发生了变化,则需要在很多地方改动,这既麻烦又易 错。 为此,就需要定义一个意义直观的标识 符, 用该标识 符存储这 些数据。该标识 符的内容 至少在它起作用的范围内是恒定不变的,该 标识 符就叫常量。程序将不再直接出现那些 复杂的不需改变的数据,而是用常量来代替。 用常量来代替这些不变的数据,可以增强程序 的易读性,减少出错的可能性,也方便了数据

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号