4.4标识符的作用域

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

§4.4标识符的作用域1.标识符的作用域1)定义:标识符的作用域是指标识符在程序中的可见范围。2)标识符的块作用域块:函数中用{,}括住的区域。一个块允许嵌套另一块。在语法上,一个块可作为一个单语句使用,称为“块语句”,又称“复合语句”。3)标识符作用域的例子:voidfunc(intx){inty=x+1;{inty=x+2;intz=x+3;y=y*y;z=z*z;coutx“”y“”zendl;}intz=x+4;y=y+y;z=z+z;coutxyzendl;}在这个程序中,形式参数x的作用域是整个函数体,在整个函数体中都可以使用x这个变量。虽然在外层块中“inty=x+1;声明了变量y,但紧接着的嵌套块中又用了”inty=x+2;声明了同名变量y,因而在嵌套块中出现的y都是指内层声明的y,对y的赋值不会影响到外层的y。在嵌套块中,由于引入了同名变量y而将外层y的作用域屏蔽了。在嵌套块结束标记}与下一条声明语句intz=x+4;之间我们不能使用标识符z,因为嵌套块中声明的z的作用域已经结束,而外层的z的作用域尚未开始。如果在主函数main()中以func(5)调用该函数,则屏幕输出结果为:5496451218总结:①在不同块内(函数内)出现同名标识符时的处理:如果块不嵌套,则相互独立。如果块出现嵌套,则在嵌套的最里层,本块定义的同名标识符可见。根据“块作用域”含义,一个块(函数)内定义的标识符在本块结束后即自动消失(被系统回收)。②编译如何处理不同块(嵌套/不嵌套)定义的同名标识符不嵌套时,在各块分别分配单元,相互独立。嵌套时,编译仍视为二个不同标识符单独分配单元。4)::运算符在内、外层出现同名标识符而又要在里层访问外层同名标识符就要利用作用域运算符::使用形式为::标识符,表示访问外面一层同名标识符。例子:Inty=8;Voidfunc(intx){inty=x+1;::y=::y*y;couty““::y“\n”;}Intmain(){func(3);couty“\n”;return0;}其中”::y=::y*y”表示将全局变量y与局部变量y的值相乘,然后再赋值给全局变量y。所以,在主函数main()中以func(3)调用该函数时屏幕输出为:432322.局部变量与全局变量1)局部变量①含义:在块作用域中声明的变量,它只是在一个函数或一个块或一个程序的某一个局部可见(可访问)。②定义形式:在函数内(在一个块内)定义的变量,或函数的形式参数,函数原型中的形参等。③优点与不足优点:即使同名,系统也会自动分配给不同存储单元相互独立,安全性好。只有执行到这一个函数(或这一块)时系统才分配空间,函数执行完程序(或块执行完),系统自动收回。不足:只有局部作用域。④处理:标识符要尽可能避免同名!!2)全局变量①含义:在文件作用域中定义的变量称全局变量。②定义形式:在函数之外定义。③作用域:从定义之位置起到文件末尾(或有特别注明注销处)。而另外一个文件加以声明(引用性说明extern)也能引用全局变量。④优点与缺点优点:作用域大,使用方便。缺点:全局变量具有副作用:当在函数中出现了对全局变量的错误修改时,其它凡使用到这全局变量的地方却全无知觉,用户要费很大劲才能发现。全局变量增加了函数之间的联系,降低了函数的独立性,导致函数难于理解且难于重复使用。⑤处理:慎用全局变量全局变量使用举例通过全局变量传递参数之例。输入年号y,判别它是否是闰年。(采用全局变量传递参数)#includeiostream.hintyear,leap,remainder;//全局参数//year表示年,leap表示是否是闰年,//是闰年为1,不是闰年为0;remainder表示year%4之结果voidisLeap()//访问到三个全局变量{if(remainder==0)leap=0;elseif((year%100==0)&&(year%400!=0))leap=0;elseleap=1;}//访问全局变量year,remainder,leapvoidmain(){cout\nEntertheyear:;cinyear;//输入年remainder=year%4;isLeap();if(leap)coutTheyearyearisleapyear!endl;elsecoutTheyearyearisnotleapyear!endl;}//这并不是一个好的程序[讨论]1.耦合:描述被调用函数和调用函数之间的界面(或数据流)。2.内聚:描述同一代码段中设置的操作步骤之间的相关性。3.原则:内聚性要好,耦合力要差(包括模块间的相互联系)。全局变量作用域:从它定义的处起到程序(文件)末(除非出现注销说明);全局变量副作用:若程序中某个部分不小心错误地修改了全局变量的值,就会影响所有使用了这个全局变量的地方。4.采用全局变量做参数传递造成的后果使用全局变量传递参数是隐式耦合,其使用没用明确的形式。这种隐式耦合要强迫开发人员或维护人员去研究相关的大量代码段(函数部分,调用函数部分,以至所有使用到这个全局变量的其他部分),才能理解程序的数据流,比如哪些函数设置这些变量的值,又有哪些函数使用这些变量的值。5.使用实际参数/形式参数形式传递参数(使用return返回结果值)--显式耦合1)形式参数的描述在函数定义中有显式描述及规定。2)实际参数的描述在函数调用时有显式描述和规定。3)实际参数与形式参数的对应关系在语言语法规则中有显式描述与规定;4)使用显式耦合,我们只要研究服务端函数的函数头(或函数原型说明)就可以了解数据流的传递方式及规则,方便排错,同时具有更好的可理解性,同时根据局部变量特点,具有更好的安全性。6.利用显式耦合之例#includeiostream.hintisLeap(intyear){if(((year%4==0)&&(year%100==0))||(year%400==0))return1;elsereturn0;}voidmain(){intYear;//局部变量cout\nEntertheyear:;cinYear;if(isLeap(Year)==1)cout\nTheyearYearisleapyear!\n;elsecout\nTheyearYearisnotleapyear!\n;}上一节返回下一节

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功