聲明:文中觀點僅代表個人,其中文字、圖檔未經本人許可,不得部分或全部轉載,違者所造成影響後後果自負!聯系本人方式: [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是定義為全局變量好,還是定義為局部變量好呢?我們陷入了兩難的境地........................ |