第8章 函数(四)变量的保护与共享

简介:       声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.com QQ:80368704全局和局部变量的缺点-----引出变量保护与共享的概念       我们从程序5看到了全局变量的优势在于它可以让多个函数共用,比如程序5中,全局的变量a,b被4个函数共用。

 

     声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式: 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();

}

/**********************************************************/

 

       一定要自己找到错误,你一定可以的,先运行一下,再动动脑筋,为什么错了。学问学问,多学多问,我问你,你思考回答,你问我,我思考回答,这就是做学问的基本的过程哦!千万不要坐等哦!


       一些天过去了,我终于找到了问题的所在,把错误程序中的函数max(),摘录如下:

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是定义为全局变量好,还是定义为局部变量好呢?我们陷入了两难的境地........................

相关文章
|
2月前
|
机器学习/深度学习
不使用临时变量
【10月更文挑战第14天】不使用临时变量。
33 7
|
5月前
|
JavaScript
S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
|
7月前
|
Python
Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。
【5月更文挑战第11天】Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。在函数内部修改全局变量需用`global`关键字声明,否则会创建新局部变量。
150 2
|
7月前
|
存储 C语言
全局变量的储存区别
全局变量的储存区别
52 0
|
Python
python之数据的赋值方式,变量内存地址的获取方式,获取变量名的方法,不同方法之间的区别
python之数据的赋值方式,变量内存地址的获取方式,获取变量名的方法,不同方法之间的区别
|
存储 C语言 Perl
西门子S7-1200的变量如何使用?什么是局部变量和全局变量?临时变量和静态变量有什么区别?
今天给大家讲一下什么是局部变量、全局变量、临时变量、静态变量,这些变量都有什么区别,以及在西门子S7-1200中这些变量如何来使用。
西门子S7-1200的变量如何使用?什么是局部变量和全局变量?临时变量和静态变量有什么区别?
临时变量
临时变量
44 0
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
379 0
|
存储
变量的储存方式
变量的储存方式
238 0
共享栈结构体定义和操作
共享栈结构体定义和操作
167 0