auto 這個這個關鍵字用於宣告變數的生存期為自動,即將不在任何類、結構、列舉、聯合和函式中定義的變數視為全域性變數,而在函式中定義的變數視為區域性變數。這個關鍵字不怎麼多寫,因為所有的變數預設就是auto的。 這個關鍵字用於宣告變數的生存期為自動,即將不在任何類、結構、列舉、聯合和函式中定義的變數視為全域性變數,而在函式中定義的變數視為區域性變數。這個關鍵字不怎麼多寫,因為所有的變數預設就是auto補充:區域性變數在函式內部定義的變數成為區域性變數。在某些C語言教材中,區域性變數稱為自動變數,這就與使用可選關鍵字a u t o定義區域性變數這一作法保持一致。區域性變數僅由其被定義的模組內部的語句所訪問。換言之,區域性變數在自己的程式碼模組之外是不可知的。切記:模組以左花括號開始,以右花括號結束。對於區域性變數,要了解的最重要的東西是:它們僅存在於被定義的當前執行程式碼塊中,即區域性變數在進入模組時生成,在退出模組時消亡。定義區域性變數的最常見的程式碼塊是函式。例如,考慮下面兩個函式。整數變數x被定義了兩次,一次在func1()中,一次在func2()中。func1()和func2()中的x互不相關。其原因是每個x作為區域性變數僅在被定義的塊內可知。語言中包括了關鍵字auto,它可用於定義區域性變數。但自從所有的非全域性變數的預設值假定為auto以來,auto就幾乎很少使用了,因此在本書所有的例子中,均見不到這一關鍵字。在每一函式模組內的開始處定義所有需要的變數,是最常見的作法。這樣做使得任何人讀此函式時都很容易,瞭解用到的變數。但並非必須這樣做不可,因為區域性變數可以在任何模組中定義。為了解其工作原理,請看下面函式。 這裡的區域性變數s就是在if塊入口處建立,並在其出口處消亡的。因此s僅在if塊中可知,而在其它地方均不可訪問,甚至在包含它的函式內部的其它部分也不行。在一個條件塊內定義區域性變數的主要優點是僅在需要時才為之分配記憶體。這是因為區域性變數僅在控制轉到它們被定義的塊內時才進入生存期。雖然大多數情況下這並不十分重要,但當代碼用於專用控制器(如識別數字安全碼的車庫門控制器)時,這就變得十分重要了,因為這時隨機儲存器(RAM)極其短缺。由於區域性變數隨著它們被定義的模組的進出口而建立或釋放,它們儲存的資訊在塊工作結束後也就丟失了。切記,這點對有關函式的訪問特別重要。當訪問一函式時,它的區域性變數被建立,當函式返回時,區域性變數被銷燬。這就是說,區域性變數的值不能在兩次呼叫之間保持。4.2.2全域性變數與區域性變數不同,全域性變數貫穿整個程式,並且可被任何一個模組使用。它們在整個程式執行期間保持有效。全域性變數定義在所有函式之外,可由函式內的任何表示式訪問。在下面的程式中可以看到,變數count定義在所有函式之外,函式main()之前。但其實它可以放置在任何第一次被使用之前的地方,只要不在函式內就可以。實踐表明,定義全域性變數的最佳位置是在程式的頂部。 仔細研究此程式後,可見變數count既不是main()也不是func1()定義的,但兩者都可以使用它。函式func2()也定義了一個區域性變數count。當func2訪問count時,它僅訪問自己定義的區域性變數count,而不是那個全域性變數count。切記,全域性變數和某一函式的區域性變數同名時,該函式對該名的所有訪問僅針對區域性變數,對全域性變數無影響,這是很方便的。然而,如果忘記了這點,即使程式看起來是正確的,也可能導致執行時的奇異行為。全域性變數由C編譯程式在動態區之外的固定儲存區域中儲存。當程式中多個函式都使用同一資料時,全域性變數將是很有效的。然而,由於三種原因,應避免使用不必要的全域性變數:①不論是否需要,它們在整個程式執行期間均佔有儲存空間。②由於全域性變數必須依靠外部定義,所以在使用區域性變數就可以達到其功能時使用了全域性變數,將降低函式的通用性,這是因為它要依賴其本身之外的東西。③大量使用全域性變數時,不可知的和不需要的副作用將可能導致程式錯誤。如在編制大型程式時有一個重要的問題:變數值都有可能在程式其它地點偶然改變。
auto 這個這個關鍵字用於宣告變數的生存期為自動,即將不在任何類、結構、列舉、聯合和函式中定義的變數視為全域性變數,而在函式中定義的變數視為區域性變數。這個關鍵字不怎麼多寫,因為所有的變數預設就是auto的。 這個關鍵字用於宣告變數的生存期為自動,即將不在任何類、結構、列舉、聯合和函式中定義的變數視為全域性變數,而在函式中定義的變數視為區域性變數。這個關鍵字不怎麼多寫,因為所有的變數預設就是auto補充:區域性變數在函式內部定義的變數成為區域性變數。在某些C語言教材中,區域性變數稱為自動變數,這就與使用可選關鍵字a u t o定義區域性變數這一作法保持一致。區域性變數僅由其被定義的模組內部的語句所訪問。換言之,區域性變數在自己的程式碼模組之外是不可知的。切記:模組以左花括號開始,以右花括號結束。對於區域性變數,要了解的最重要的東西是:它們僅存在於被定義的當前執行程式碼塊中,即區域性變數在進入模組時生成,在退出模組時消亡。定義區域性變數的最常見的程式碼塊是函式。例如,考慮下面兩個函式。整數變數x被定義了兩次,一次在func1()中,一次在func2()中。func1()和func2()中的x互不相關。其原因是每個x作為區域性變數僅在被定義的塊內可知。語言中包括了關鍵字auto,它可用於定義區域性變數。但自從所有的非全域性變數的預設值假定為auto以來,auto就幾乎很少使用了,因此在本書所有的例子中,均見不到這一關鍵字。在每一函式模組內的開始處定義所有需要的變數,是最常見的作法。這樣做使得任何人讀此函式時都很容易,瞭解用到的變數。但並非必須這樣做不可,因為區域性變數可以在任何模組中定義。為了解其工作原理,請看下面函式。 這裡的區域性變數s就是在if塊入口處建立,並在其出口處消亡的。因此s僅在if塊中可知,而在其它地方均不可訪問,甚至在包含它的函式內部的其它部分也不行。在一個條件塊內定義區域性變數的主要優點是僅在需要時才為之分配記憶體。這是因為區域性變數僅在控制轉到它們被定義的塊內時才進入生存期。雖然大多數情況下這並不十分重要,但當代碼用於專用控制器(如識別數字安全碼的車庫門控制器)時,這就變得十分重要了,因為這時隨機儲存器(RAM)極其短缺。由於區域性變數隨著它們被定義的模組的進出口而建立或釋放,它們儲存的資訊在塊工作結束後也就丟失了。切記,這點對有關函式的訪問特別重要。當訪問一函式時,它的區域性變數被建立,當函式返回時,區域性變數被銷燬。這就是說,區域性變數的值不能在兩次呼叫之間保持。4.2.2全域性變數與區域性變數不同,全域性變數貫穿整個程式,並且可被任何一個模組使用。它們在整個程式執行期間保持有效。全域性變數定義在所有函式之外,可由函式內的任何表示式訪問。在下面的程式中可以看到,變數count定義在所有函式之外,函式main()之前。但其實它可以放置在任何第一次被使用之前的地方,只要不在函式內就可以。實踐表明,定義全域性變數的最佳位置是在程式的頂部。 仔細研究此程式後,可見變數count既不是main()也不是func1()定義的,但兩者都可以使用它。函式func2()也定義了一個區域性變數count。當func2訪問count時,它僅訪問自己定義的區域性變數count,而不是那個全域性變數count。切記,全域性變數和某一函式的區域性變數同名時,該函式對該名的所有訪問僅針對區域性變數,對全域性變數無影響,這是很方便的。然而,如果忘記了這點,即使程式看起來是正確的,也可能導致執行時的奇異行為。全域性變數由C編譯程式在動態區之外的固定儲存區域中儲存。當程式中多個函式都使用同一資料時,全域性變數將是很有效的。然而,由於三種原因,應避免使用不必要的全域性變數:①不論是否需要,它們在整個程式執行期間均佔有儲存空間。②由於全域性變數必須依靠外部定義,所以在使用區域性變數就可以達到其功能時使用了全域性變數,將降低函式的通用性,這是因為它要依賴其本身之外的東西。③大量使用全域性變數時,不可知的和不需要的副作用將可能導致程式錯誤。如在編制大型程式時有一個重要的問題:變數值都有可能在程式其它地點偶然改變。