999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

解析全局變量和局部變量在程序設計中的效應

2012-04-29 00:00:00王吉
China’s foreign Trade·下半月 2012年3期

【摘要】 全局變量不受作用域的影響,問題可以使用的(也就是說,全局變量的生命期一直到程序的結束)。局部變量出現在一個作用域內,它們是局限于一個函數的。

【關鍵詞】 局部變量 全局變量

全局變量是在所有函數體的外部定義的,程序的所在部分(甚至其它文件中的代碼)都可以使用。全局變量不受作用域的影響,問題可以使用的(也就是說,全局變量的生命期一直到程序的結束)。如果在一個文件中使用extern關鍵字來聲明另一個文件中存在的全局變量,那么這個文件可以使用這個數據。局部變量出現在一個作用域內,它們是局限于一個函數的。局部變量經常被稱為自動變量,因為它們在進入作用域時自動生成,離開作用域時自動消失。關鍵字auto可以顯式地說明這個問題,但是局部變量默認為auto,所以沒有必要聲明為auto。

關鍵字static有一些獨特的意義。通常,函數中定義局部變量在函數中作用域結束時消失。當再次調用這個函數時,會重新創建變量的存儲空間,其值會被重新初始化。如果想使局部變量的值在程序的整個生命期里仍然存在,我們可以定義函數的局部變量為static(靜態的),并給它一個初始化。初始化只在函數第一次調用時執行,函數調用之間變量的值保持不變,這種方式,函數可以“記住”函數調用之間的一些信息片斷。我們可能奇怪為什么不使用全局變量。static變量的優點是在函數范圍之外它是不可用的,所以它不可能被輕易改變。這會使錯誤局部化。外部變量extern告訴編譯器存在著一個變量和函數,即使編譯器在當前的文件中沒有看到它。這個變量或函數可能在一個文件或者在當前文件的后面定義。例如extern int i;編譯器會知道i肯定作為全局變量存在于某處。當編譯器看到變量i的定義時,并沒有看到別的聲明,所以知道它在文件的前面已經找到了同樣聲明的i 。

當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個源文件,一個是a.c,另一個是main.c.

為什么在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,并且都沒有加static前綴,因此對于另外的源文件main.c是可見的。

如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上 static,main.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名沖突。Static可以用作函數和變量的前綴,對于函數來講,static的作用僅限于隱藏,而對于變量,static還有下面兩個作用。

存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和 全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。雖然這種用法不常見,按存儲區域分,全局變量、靜態全局變量和靜態局部變量都存放在內存的靜態存儲區域,局部變量存放在內存的棧區。按作用域分, 全局變量在整個工程文件內都有效;靜態全局變量只在定義它的文件內有效;靜態局部變量只在定義它的函數內有效,只是程序僅分配一次內存,函數返回后,該變量不會消失;局部變量在定義它的函數內有效,但是函數返回后失效。

全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。

從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域, 限制了它的使用范圍。static 函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件static全局變量與普通的全局變量有什么區別:static全局變量只初始化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值; static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝。全局變量和靜態變量如果沒有手工初始化,則由編譯器初始化為0。局部變量的值不可知。

參考文獻:

[1]《C語言程序設計》 清華大學出版社2004年第一版.

(作者單位: 大慶職業學院計算機系)

主站蜘蛛池模板: 国产午夜精品一区二区三| 亚洲a级在线观看| 全部免费毛片免费播放| 成人午夜天| 欧美日韩成人| 亚洲中文久久精品无玛| a亚洲视频| 国产黄网永久免费| 国产日本欧美在线观看| 亚洲二区视频| 麻豆国产在线观看一区二区| 日韩天堂视频| 精品国产网站| 综合色在线| 久久久久亚洲AV成人人电影软件| 欧美人人干| 久久国产精品77777| 国产区91| 国模沟沟一区二区三区| 青青青视频91在线 | 日本一本正道综合久久dvd| 四虎影视8848永久精品| 国产视频入口| 日本人妻丰满熟妇区| 精品91视频| 亚洲综合香蕉| 欧美成人aⅴ| 精品無碼一區在線觀看 | 国产精品网址你懂的| 免费啪啪网址| vvvv98国产成人综合青青| 国产亚洲精品资源在线26u| 青青草国产一区二区三区| 国产日韩欧美在线视频免费观看 | 精品国产Av电影无码久久久| 97人人模人人爽人人喊小说| 性视频久久| 亚洲综合狠狠| 国产精品久久久精品三级| 国产鲁鲁视频在线观看| 一级香蕉人体视频| 国产成人凹凸视频在线| 在线国产你懂的| 91亚瑟视频| 国产18在线播放| 国产一二三区视频| 爆操波多野结衣| 波多野结衣中文字幕久久| 成·人免费午夜无码视频在线观看 | 午夜毛片免费观看视频 | 久久狠狠色噜噜狠狠狠狠97视色| 国产精品香蕉在线观看不卡| 亚洲精品视频免费看| 色久综合在线| 亚洲A∨无码精品午夜在线观看| 狠狠色成人综合首页| 91精品国产自产在线观看| 综合色天天| 亚洲精品片911| 国内黄色精品| 永久毛片在线播| 国产人妖视频一区在线观看| 日韩二区三区| 色综合综合网| 日韩欧美视频第一区在线观看 | 国内精品九九久久久精品| 亚洲中字无码AV电影在线观看| 欧美成人看片一区二区三区| 欧洲欧美人成免费全部视频| 精品视频第一页| 国产成人av一区二区三区| 91视频99| 丁香婷婷综合激情| 免费观看精品视频999| 国产三级毛片| 国产在线视频欧美亚综合| 精品国产欧美精品v| 992tv国产人成在线观看| 日韩福利在线视频| 大乳丰满人妻中文字幕日本| 日本人妻丰满熟妇区| 国产精品久久久久久久伊一|