声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:
80368704@qq.com
QQ:80368704
全局和局部变量的缺点-----引出变量保护与共享的概念我们从程序5看到了全局变量的优势在于它可以让多个函数共用,比如程序5中,全局的变量a,b被4个函数共用。而第1节的程序4中,每个函数中定义了a和b,a,b是定义为局部变量的。而局部变量只能是在定义它的函数内使用,即是在本函数内使用或有效; 其他函数不可使用它,或说某个函数的局部变量对其他函数来说是不可见的。 全局变量真的是好方便哦,它的出现让变量在多个函数中都能用,或说实现了多个函数的数据共享,从而弥补了局部变量只能在一个函数中使用的不足。 这里所说的数据共享有2个含义:全局变量可以被多个函数读和改; 读的意思就是在全局变量被使用后,它的值不变; 改的意思就是在全局变量被使用后,它的值变化了;也就是说:全局变量的值既可以被多个函数读取,也可以被多个函数改变; 问题又来了,什么问题呢?别急,先来帮我个忙 。我在写程序5的时候,犯了一个小错误,找了很长时间也没找到错误在什么地方,你能帮我找找吗? 程序5(有错的): /********************************************************/ #include〈stdio.h〉 float a,b;/*-------------改动1------------------------------*/ void max()/*求任意2个数字的最大值。*/ {float m; a=a>b?a:b; printf("%f/n",a); } void min()/*求任意2个数字的最小值。*/ {float m; m=a<b?a:b; printf("%f/n",m); } void average()/*求任意2个数字的平均值。*/ {float m; m=(a+b)/2; printf("%f/n",m); } void main() { scanf("%f%f",&a,&b);/*--------改动2----------------*/ max(); min(); average(); } /**********************************************************/
一定要自己找到错误,你一定可以的,先运行一下,再动动脑筋,为什么错了。学问学问,多学多问,我问你,你思考回答,你问我,我思考回答,这就是做学问的基本的过程哦!千万不要坐等哦! void max()/*求任意2个数字的最大值。*/ { float m; a=a>b?a:b; printf("%f/n",a); } 我发现a在这句中有可能被重新赋值, a=a>b?a:b; 由于a是全局变量,我的程序中3个函数都可能改变它 如果a在max函数中被错误的改变了,后面使用a的min()和average()函数就肯定要出错了. 庆幸的是我的程序只有3个函数,而且在第1个函数max中,我找到了问题的所在, 真是幸运,祝贺一下----------------哦耶!!! 但此时,我有了一个担忧:全局变量a的值太容易被改变了,在定义a的语句的后面,所有函数,谁都能改变它的值, 那么,如果我的这个程序中有1000个函数时,我就很难发现是谁改变了a的值,MY GOD!,如果发生赋值错误,我只有把1000个函数从头开始,仔细的检查所有和a变量有关的赋值语句,仔细的进行研究,最不幸运的情况是,我可能要检查遍所有的函数,才可能找到问题所在.或许,还不是检查一遍2遍,那时,我将欲哭无泪.......... 全局变量的这个问题,简直太恐怖了, 咋办?????????????????????????????????? 说实在的,在C中,没什么好办法可以避免全局变量上面问题的发生,我们就只好忍痛割爱了,我不用你全局变量了,返回头再看看局部变量吧 在程序4中,我们使用的a,b全部是局部变量;局部变量只能在定义它的函数中使用,其他函数不能使用它,即不能读或写它,就象我们曾经说,局部变量的这个特点阻碍了数据的重复使用,比如:max()函数输入a,b,不能被min()使用;同样的min()函数输入a,b,也不能被max()使用;可是现在,鉴于在程序5中,我们把变量a,b改为全局变量后,出现的恐怖后果,我们开始重新思考程序4中的局部变量的这个缺点,到底算不算缺点;换句话描述局部变量的上述缺点:局部变量受到了所在函数的保护,保护变量不被其他函数随意的修改,当我的程序有1000个函数时,所有函数中都有局部变量a,b,但这时的a,b只能是被定义它的函数修改,和其他函数没有关系;即使我错误的改变了a,b的值,也只是该函数有问题,错误和其他函数也没有任何关系,这就避免了全局变量的恐怖缺点了. 我们发现了,其实局部变量的这个特性,在我们的程序中函数较多时,避免变量被其他函数随意修改.我们说局部变量被密封在定义它的函数中,或者说局部变量被函数封装了,千万不要小看封装这两个字,它正是面向对象程序设计思想的核心内容之一. 但是,既然局部变量如此的好,我们为何要在本章第2节把局部变量a,b改成全局变量a,b呢? 记不得没关系,休息,休息,开始深呼吸: 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气...................., 吸气..........................呼气.................... 哈哈,好了,现在,记不得的话,返回头,温习一下本章第2节吧,重点注意那两行绿色的字哦........... 在程序5中,函数main()输入a,b的值,被max(),min(),average()都能使用,是因为我们使用全局变量代替了程序4中的局部变量,但是随后发现,在程序不断变大后,全局变量是查找错误的工作量变得越来越大。 于是我们又重新返回头审视了程序4中的局部变量的封装特性,并发现,如果使用局部变量定义a和b,会避免a、b被其他函数随意修改,但同时其他函数也不能读取这两个变量的值。比如程序4里的 max()中的a,b变量,min()既不能读它们的值,也不能向它们赋新值。 我们看到: 局部变量优点在于被封装,缺点在于不能共享给其它函数所使用; 全局变量优点在于被共享,缺点在于不能得到某函数的封装保护。 到底a,b是定义为全局变量好,还是定义为局部变量好呢?我们陷入了两难的境地........................ |