天天看點

第8章 函數(四)變量的保護與共享

     聲明:文中觀點僅代表個人,其中文字、圖檔未經本人許可,不得部分或全部轉載,違者所造成影響後後果自負!聯系本人方式: [email protected] 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個數字的最小值。*/

m=a<b?a:b;

printf("%f/n",m);

void average()/*求任意2個數字的平均值。*/

m=(a+b)/2;

void main()

{

scanf("%f%f",&a,&b);/*--------改動2----------------*/

max();

min();

average();

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

       一定要自己找到錯誤,你一定可以的,先運作一下,再動動腦筋,為什麼錯了。學問學問,多學多問,我問你,你思考回答,你問我,我思考回答,這就是做學問的基本的過程哦!千萬不要坐等哦!

       一些天過去了,我終于找到了問題的所在,把錯誤程式中的函數max(),摘錄如下:

{ float m;

我發現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是定義為全局變量好,還是定義為局部變量好呢?我們陷入了兩難的境地........................

繼續閱讀