區域性變數和全域性變數
區域性變數
定義變數可能有3種情況:
- 在函式的開頭定義
- 在函式內的複合語句內定義
- 在函式的外部定義
在一個函式內部定義的變數只在本函式範圍內有效,也就是說只有在本函式內才能引用它們,在此函式以外是不能使用這些變數的
在複合語句內定義的變數只在本複合語句範圍內有效,只有在本複合語句內才能引用它們,在該複合語句以外是不能使用這些變數的
以上稱為“區域性變數”
主函式中定義的變數也只在主函式中有效,並不因為在主函式中定義而在整個檔案中或程式中有效。主函式也不能使用其他函式中定義的變數
不同函式中可以使用同名的變數,它們代表不同的物件,互不干擾
形參也是區域性變數
在一個函式內部,可以在複合語句中定義變數,這些變數只在本複合語句中有效,這種複合語句也稱為“分程式”或“程式塊”
全域性變數
程式的編譯單位是源程式檔案,一個原始檔可以包含一個或若干個函式,在函式內定義的變數是區域性變數,而在函式外定義的變數稱為外部變數,外部變數是全域性變數(也稱全程變數)
全域性變數可以為本檔案中其他函式所共用。它的有效範圍為從定義變數的開始到本原始檔結束
在一個函式中既可以使用本函式中的區域性變數,也可以使用有效的全域性變數
設定全域性變數的作用是增加了函式間資料聯絡的渠道,由於同一檔案中的所有函式都能引用全域性變數的值,因此如果在一個函式中改變了全域性變數的值,就能影響到其他函式中全域性變數的值,相當於各個函式間有直接的傳遞通道,由於函式的呼叫只能帶回一個函式返回值,因此有時可以利用全域性變數來對增加函式間的聯絡渠道,透過函式呼叫能得到一個以上的值
建議不在必要時不要使用全域性變數,原因如下:
- 全域性變數在程式的全部執行過程中都佔用儲存單元,而不是僅在需要時才開闢
- 它使函式的通用性降低了,因為如果在函式中引用了全域性變數,那麼執行情況會受到有關的外部變數的影響,如果將一個函式移到另一個檔案中,還要考慮把有關的外部變數及其值一起移過去。但是若該外部變數與其他檔案的變數同名時,就會出現問題。這就降低了程式的可靠性和通用性。在程式設計中,在劃分模組時要求模組的“內聚性”強、與其他模組的“耦合性”弱。即模組的功能要單一(不要把許多互不相干的功能放到一個模組中)與其他模組的相互影響要儘量少,而用全域性變數是不符合這個原則的。一般要求C程式中的函式做成一個相對的封閉體,除了可以透過“實參---形參”的渠道與外界發生聯絡外,沒有其他渠道。這樣的程式移植性好,可讀性強
- 使用全域性變數過多,會降低程式的清晰性,人們往往難以清楚的判斷出每個瞬時各個外部變數的值。由於在各個函式執行時都可能改變外部變數的值,程式容易出錯。因此,要限制使用全域性變數
如果在同一個原始檔中,全域性變數和區域性變數同名時,在區域性變數的作用範圍內,區域性變數有效,全域性變數被“遮蔽”,即全域性變數不起作用