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年第一版.

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

主站蜘蛛池模板: 国产成人AV综合久久| 国产成年女人特黄特色毛片免| 99er这里只有精品| 国产a v无码专区亚洲av| 午夜精品一区二区蜜桃| 亚洲欧美综合在线观看| 精品欧美一区二区三区久久久| 免费无码AV片在线观看中文| 亚洲中文字幕国产av| 欧美影院久久| 色婷婷天天综合在线| 欧美影院久久| 国产精品女在线观看| 久久久久久久久久国产精品| 女人一级毛片| 天天综合网色中文字幕| 亚洲精品大秀视频| 99热这里只有精品5| 国产第一色| 免费看久久精品99| 日本欧美成人免费| 国产一二三区在线| 精品视频一区在线观看| 国产精品lululu在线观看| 国产色爱av资源综合区| 久久情精品国产品免费| 99视频精品在线观看| 国产激情无码一区二区免费 | 亚洲国产一成久久精品国产成人综合| 伊人福利视频| 国产精品污视频| 99在线国产| 欧美日韩国产成人高清视频| 久久国产精品国产自线拍| 婷婷99视频精品全部在线观看 | 国产在线一区二区视频| 人人91人人澡人人妻人人爽| 亚洲三级视频在线观看| 久久精品丝袜| 91视频国产高清| 精品在线免费播放| 秋霞午夜国产精品成人片| 国产亚洲高清在线精品99| 欧美性久久久久| 日韩av无码DVD| 国产亚洲视频播放9000| 亚洲色图欧美视频| 综合五月天网| 欧美一级在线播放| 久久性视频| 久久精品娱乐亚洲领先| 国产精品网曝门免费视频| 高清欧美性猛交XXXX黑人猛交| 久久香蕉欧美精品| 亚洲天堂网在线视频| 日韩精品无码不卡无码| 国产三区二区| 中文字幕久久亚洲一区| 国产日韩丝袜一二三区| 国产综合网站| 亚洲中文制服丝袜欧美精品| 一区二区三区精品视频在线观看| 国产成人艳妇AA视频在线| 国产在线一区视频| 国产黄网永久免费| 免费国产一级 片内射老| 国产精品无码一二三视频| 精品丝袜美腿国产一区| 亚洲性色永久网址| 激情六月丁香婷婷| 精品国产毛片| 久久综合九九亚洲一区| 亚洲成人免费在线| 亚洲欧洲免费视频| 国产青青草视频| 婷婷99视频精品全部在线观看 | 青青热久免费精品视频6| 成人国产免费| 免费看av在线网站网址| 国产欧美成人不卡视频| 在线国产三级| 91蝌蚪视频在线观看|