标识符的作用域_第1页
标识符的作用域_第2页
标识符的作用域_第3页
标识符的作用域_第4页
标识符的作用域_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4.4标识符的作用域 1标识符的作用域 1) 定义:标识符的作用域是指标识符在程序中的可见范围。 2) 标识符的块作用域 块:函数中用,括住的区域。 一个块允许嵌套另一块。在语法上,一个块可作为一个单语句使用,称为“块语句”,又称“复合语句”。 23) 标识符作用域的例子: void func(int x) int y=x+1; int y=x+2; int z=x+3; y=y*y; z=z*z; coutx“ ”y“ ”zendl; int z=x+4; y=y+y; z=z+z; coutx y zendl; 3在这个程序中,形式参数x的作用域是整个函数体,在整个函数体中都可以使用x这个

2、变量。虽然在外层块中“int y=x+1; 声明了变量y,但紧接着的嵌套块中又用了”int y=x+2;声明了同名变量y,因而在嵌套块中出现的y都是指内层声明的y,对y的赋值不会影响到外层的y。4在嵌套块中,由于引入了同名变量y而将外层y的作用域屏蔽了。在嵌套块结束标记与下一条声明语句int z=x+4;之间我们不能使用标识符z,因为嵌套块中声明的z的作用域已经结束,而外层的z的作用域尚未开始。如果在主函数main( )中以func(5)调用该函数,则屏幕输出结果为: 54964 51218 5总结: 在不同块内(函数内)出现同名标识符时的处理: 如果块不嵌套,则相互独立。如果块出现嵌套,则在

3、嵌套的最里层,本块定义的同名标识符可见。根据“块作用域”含义,一个块(函数)内定义的标识符在本块结束后即自动消失(被系统回收)。 6 编译如何处理不同块(嵌套/不嵌套)定义的同名标识符 不嵌套时,在各块分别分配单元,相互独立。嵌套时,编译仍视为二个不同标识符单独分配单元。 74) :运算符在内、外层出现同名标识符而又要在里层访问外层同名标识符就要利用作用域运算符:使用形式为 :标识符,表示访问外面一层同名标识符。8例子:Int y=8;Void func(int x) int y=x+1; :y=:y*y; couty“ “:y“n”;Int main() func(3); couty“n”;

4、 return 0;其中”:y=:y*y”表示将全局变量y与局部变量y的值相乘,然后再赋值给全局变量y。所以,在主函数main()中以func(3)调用该函数时屏幕输出为:4323292.局部变量与全局变量 1)局部变量 含义:在块作用域中声明的变量,它只是在一个函数或一个块或一个程序的某一个局部可见(可访问)。 定义形式:在函数内(在一个块内)定义的变量,或函数的形式参数,函数原型中的形参等。10优点与不足优点:即使同名,系统也会自动分配给不同存储单元相互独立 ,安全性好。只有执行到这一个函数(或这一块)时系统才分配空间,函数执行完程序(或块执行完),系统自动收回。不足:只有局部作用域。处理

5、:标识符要尽可能避免同名! 112) 全局变量 含义: 在文件作用域中定义的变量称全局变量。 定义形式: 在函数之外定义。 12 作用域:从定义之位置起到文件末尾(或有特别注明注销处)。而另外一个文件加以声明(引用性说明extern)也能引用全局变量。13 优点与缺点优点:作用域大,使用方便。 缺点: 全局变量具有副作用:当在函数中出现了对全局变量的错误修改时,其它凡使用到这全局变量的地方却全无知觉,用户要费很大劲才能发现。全局变量增加了函数之间的联系,降低了函数的独立性,导致函数难于理解且难于重复使用。处理: 慎用全局变量 14全局变量使用举例通过全局变量传递参数之例。输入年号y,判别它是否

6、是闰年。(采用全局变量传递参数) #include int year, leap, remainder; /全局参数 /year 表示年,leap 表示是否是闰年,/是闰年为1,不是闰年为0; remainder 表示year%4之结果 void isLeap( ) /访问到三个全局变量 if(remainder!=0) leap=0; else if(year%100=0)&(year%400!=0) leap=0; else leap=1; /访问全局变量year, remainder, leap void main() coutyear; /输入年 remainder=year%4; i

7、sLeap(); if(leap) cout The year year is leap year !endl; else cout The year year is not leap year !endl; /这并不是一个好的程序 15讨论 1.耦合: 描述被调用函数和调用函数之间的界面(或数据流)。 2.内聚: 描述同一代码段中设置的操作步骤之间的相关性。 3.原则: 内聚性要好,耦合力要差(包括模块间的相互联系)。 16全局变量作用域:从它定义的处起到程序(文件)末(除非出现注销说明); 全局变量副作用:若程序中某个部分不小心错误地修改了全局变量的值,就会影响所有使用了这个全局变量的地方

8、。4.采用全局变量做参数传递造成的后果17使用全局变量传递参数是隐式耦合,其使用没用明确的形式。这种隐式耦合要强迫开发人员或维护人员去研究相关的大量代码段(函数部分,调用函数部分,以至所有使用到这个全局变量的其他部分),才能理解程序的数据流,比如哪些函数设置这些变量的值,又有哪些函数使用这些变量的值。185.使用实际参数/形式参数形式传递参数(使用return返回结果值)-显式耦合 1)形式参数的描述在函数定义中有显式描述及规定。 2)实际参数的描述在函数调用时有显式描述和规定。193)实际参数与形式参数的对应关系在语言语法规则中有显式描述与规定; 4)使用显式耦合,我们只要研究服务端函数的函数头(或函数原型说明)就可以了解数据流的传递方式及规则,方便排错,同时具有更好的可理解性,同时根据局部变量特点,具有更好的安全性。206.利用显式耦合之例 #include int isLeap(int year) if(year%4=0)&(year%100=0)|(year%400=0) return 1; else return 0; void main() in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论