第8章 函式 五 變數的分級保護

2021-08-23 13:41:05 字數 2282 閱讀 5480

[email protected]

上一節我們在全域性變數和區域性變數難以取捨的矛盾中結束,其實在現實世界中,存在著許多矛盾,他們是如此的對立,但是又同時存在,缺一不可.

比如:生和死,甜和苦,真和假,男和女,笑和苦,實在是太多了,他們是對立著,同時又統一著,不是嗎?人分男和女;人人生娃,都想要男的,沒有女娃可以嗎?哈哈,矛盾啊矛盾!!!

我要說的就是區域性變數和全域性變數各有優點,我們都需要;不一定要否定掉其中的乙個,只不過到底用哪一種,需要我們程式設計師自己選擇罷了.也就是變數該如何被共享和保護應該由程式設計師自己決定,而且必須能由程式設計師決定;對於乙個變數,程式設計師必須有足夠的權利去決定,它讓哪些程式或函式使用,同時又不讓哪些程式或函式使用.

於是在c程式設計中,採用了變數分級保護的思想。什麼是分級保護的思想呢?舉個例子吧:

對於我個人,有些事情,除了自己,不想讓任何人知道的,這樣的資訊就是我的絕密!而有些事情,除了家人,就不想讓外人知道了,這樣的資訊對我來說就是機密!另外的一些事情,是可以讓任何人知道的,這樣的資訊就是公告了!我們常說:該你知道的,告訴你;不該你知道的,別打聽,否則會大禍臨頭的.個人的資訊就這樣被我簡單的分成了3個保密級別:絕密、機密和公告。這就是我所謂的資訊分級保護的思想。更確切的說是分區域分範圍的保護,這裡的範圍有3個:個人、家庭、全社會。我的資訊受到了分級思想的保護,從而不會被不該知道的人知道。

回到c程式設計中來,我們的變數作為程式中的資訊,也應能被分級保護;而在第2節中,我們說到程式分4級:工程---檔案---函式---復合語句塊,因此變數根據定義位置的不同,分4級進行保護,使其不被不該使用它的程式見到它,或者說訪問它。

詳細的,在c程式設計中,我們為變數設定的4級保護是:

塊級的變數:相當於最嚴密的絕密級保護,變數定義在某個塊的"while(i<5);

printf("k=%d/n",k);/*這句是錯誤的,因為它試圖讀取內層塊的區域性變數k,執行時應該注釋掉*/

getch();

} 在後面的章節,我們會專門說明靜態變數的作用。

函式級的變數:同樣相當於最嚴密的絕密級保護,變數定義在某個函式的"就像復合語句或函式的外殼一樣,保護著它內部定義的變數不被外界訪問.

檔案級的變數:相當於機密級,當我們的變數定義在所有函式之外,也就是你定義了乙個全域性變數,之後,在全域性變數定義語句的最前面加上static,就是static(靜態)全域性變數。這種變數的讀寫許可權比起函式級的變數進一步放鬆了,即從函式級擴大到檔案級。

工程級的變數:相當於公告級,當我們的變數定義在乙個檔案的所有函式之外,也就是你定義了乙個全域性變數,我們知道,函式之外定義的變數是全域性變數,當你的全域性變數的定義語句前不用static限定時,那麼全域性變數可以被你的工程中的每乙個函式讀取和修改。而上面冠以static的全域性變數只能被他所在檔案的函式讀寫。這就是static全域性變數和全域性變數的區別所在,本章的例子----程式5中的變數a,b就是全域性變數。當然如何在定義全域性變數的檔案之外使用該全域性變數,還是有些麻煩的,詳見後面關於可見性的描述。

還有一些概念,進一步描述一下::

塊級和函式級的變數,在定義它的{}中,可以使用,或者說只有定義它的{}可以看見它,{}之外不可見,不可使用。

檔案級的變數,在定義它的檔案中,可以使用,或者說只有定義它的檔案中的函式可以看見它,其他檔案中的函式見不到它。

工程級的變數,在定義它的工程中,可以使用,或者說只要是工程函式都有可能可以看見它,即對所有檔案中的函式公開.注意有可能這3個字,將會引出extern的講解(to be continued............)。

如此我們就有了變數可見性的概念,可以看出,由於定義位置不同,因而變數受到不同級別的保護,於是可見性就不同了.

變數可以被見到,就可以被使用,或者說變數就可以被訪問,我們說變數此時起作用了,

一般的函式級的變數,在定義它的函式中,起作用,

一般的檔案級的變數,在定義它的檔案中,起作用,

一般的工程級的變數,在定義它的工程中,起作用,

我們看到各種級別的變數起作用的區域時不同的,這就是所謂作用域的概念. 我們看到作用域有大有小,作用域也有4個,從大到小是:工程區域、檔案區域、函式區域、塊區域。這4個區域存在包含的關係。我們說塊在最內層,而工程區域在最外層。

變數的可見性和它的作用域大部分情況下是一致的,但是也存在這種情況,即在內層塊中定義的變數,隱藏了外層塊中同名的變數。一般情況下,沒有辦法引用被隱藏的變數。

第8章 函式

位置實參,關鍵字是參 預設值,注意順序,把已經有預設值的放在最後 topping這個可以接收任何實參,一般放形參最後,它是個空元組,當作列表一樣就行 def pet name,size 27 預設值 print name size n input please get me a name s inp...

第8章 函式

定義函式,注意書寫格式 向函式傳遞資訊 實參和形參 傳遞實參 位置實參,注意順序 關鍵字實參,名稱和值對應,寫在函式裡,務必準確指定函式定義的形參名 預設值混合使用時,注意格式,讓實參變成可選的,新增預設值,並且放在形參列表最後 切片法 建立列表副本 星號建立空元組,傳遞任意數量的實參 結合使用位置...

第8章 變數的儲存型別

自動變數 區域性變數 函式內部定義的變數被稱為自動變數,用關鍵字auto表示 一般使用的都是自動變數,auto int x 相當於 int x 作用域侷限於函式之內,當函式被呼叫時,在棧區為其分配記憶體空間,生命期在函式呼叫期間 形參也是自動變數 所有函式共享棧,所以函式結束後,自動變數無法保持其值...