亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言函數的作用域規則

2019-11-17 05:23:03
字體:
來源:轉載
供稿:網友

  “語言的作用域規則”是一組確定一部分代碼是否“可見”或可訪問另一部分代碼和數據的規則。
C語言中的每一個函數都是一個獨立的代碼塊。一個函數的代碼塊是隱藏于函數內部的,不能被任何其它函數中的任何語句(除調用它的語句之外)所訪問(例如,用g o t o語句跳轉到另一個函數內部是不可能的)。構成一個函數體的代碼對程序的其它部分來說是隱蔽的,它既不能影響程序其它部分,也不受其它部分的影響。換言之,由于兩個函數有不同的作用域,定義在一個函數內部的代碼數據無法與定義在另一個函數內部的代碼和數據相互作用。
C語言中所有的函數都處于同一作用域級別上。這就是說,把一個函數定義于另一個函數內部是不可能的。
4.2.1 局部變量
在函數內部定義的變量成為局部變量。在某些C語言教材中,局部變量稱為自動變量,這就與使用可選要害字a u t o定義局部變量這一作法保持一致。局部變量僅由其被定義的模塊內部的語句所訪問。換言之,局部變量在自己的代碼模塊之外是不可知的。切記:模塊以左花
括號開始,以右花括號結束。
對于局部變量,要了解的最重要的東西是:它們僅存在于被定義的當前執行代碼塊中,即局部變量在進入模塊時生成,在退出模塊時消亡。
定義局部變量的最常見的代碼塊是函數。例如,考慮下面兩個函數。
C語言函數的作用域規則(圖一)
整數變量x被定義了兩次,一次在func1()中,一次在func2()中。func1()和func2()中的x互不相關。其原因是每個x作為局部變量僅在被定義的塊內可知。
語言中包括了要害字auto,它可用于定義局部變量。但自從所有的非全局變量的缺省值假定為auto以來,auto就幾乎很少使用了,因此在本書所有的例子中,均見不到這一要害字。
在每一函數模塊內的開始處定義所有需要的變量,是最常見的作法。這樣做使得任何人讀此函數時都很輕易,了解用到的變量。但并非必須這樣做不可,因為局部變量可以在任何模塊中定義。為了解其工作原理,請看下面函數。
C語言函數的作用域規則(圖二)
這里的局部變量s就是在if塊入口處建立,并在其出口處消亡的。因此s僅在if塊中可知,而在其它地方均不可訪問,甚至在包含它的函數內部的其它部分也不行。
在一個條件塊內定義局部變量的主要優點是僅在需要時才為之分配內存。這是因為局部變量僅在控制轉到它們被定義的塊內時才進入生存期。雖然大多數情況下這并不十分重要,但當代碼用于專用控制器(如識別數字安全碼的車庫門控制器)時,這就變得十分重要了,因為這時隨機存儲器(RAM)極其短缺。
由于局部變量隨著它們被定義的模塊的進出口而建立或釋放,它們存儲的信息在塊工作結束后也就丟失了。切記,這點對有關函數的訪問非凡重要。當訪問一函數時,它的局部變量被建立,當函數返回時,局部變量被銷毀。這就是說,局部變量的值不能在兩次調用之間保持。
4.2.2全局變量
與局部變量不同,全局變量貫穿整個程序,并且可被任何一個模塊使用。它們在整個程序執行期間保持有效。全局變量定義在所有函數之外,可由函數內的任何表達式訪問。在下面的程序中可以看到,變量count定義在所有函數之外,函數main()之前。但其實它可以放置在任何第一次被使用之前的地方,只要不在函數內就可以。實踐表明,定義全局變量的最佳位置是在程序的頂部。
C語言函數的作用域規則(圖三)
仔細研究此程序后,可見變量count既不是main()也不是func1()定義的,但兩者都可以使用它。函數func2()也定義了一個局部變量count。當func2訪問count時,它僅訪問自己定義的局部變量count,而不是那個全局變量count。切記,全局變量和某一函數的局部變量同名時,該函數對該名的所有訪問僅針對局部變量,對全局變量無影響,這是很方便的。然而,假如忘記了這點,即使程序看起來是正確的,也可能導致運行時的奇異行為。
全局變量由C編譯程序在動態區之外的固定存儲區域中存儲。當程序中多個函數都使用同一數據時,全局變量將是很有效的。然而,由于三種原因,應避免使用不必要的全局變量:
①不論是否需要,它們在整個程序執行期間均占有存儲空間。②由于全局變量必須依靠外部定義,所以在使用局部變量就可以達到其功能時使用了全局變量,將降低函數的通用性,這是因為它要依靠其本身之外的東西。③大量使用全局變量時,不可知的和不需要的副作用將
可能導致程序錯誤。如在編制大型程序時有一個重要的問題:變量值都有可能在程序其它地點偶然改變。
結構化語言的原則之一是代碼和數據的分離。C語言是通過局部變量和函數的使用來實現這一分離的。下面用兩種方法編制計算兩個整數乘積的簡單函數mul()。
通用的專用的
mul(x,y) intx,y;
intx,y; mul()
{{
return(x*y);return(x*y);
}}
兩個函數都是返回變量x和y的積,可通用的或稱為參數化版本可用于任意兩整數之積,而專用的版本僅能計算全局變量x和y的乘積。
4.2.3動態存儲變量
從變量的作用域原則出發,我們可以將變量分為全局變量和局部變量;換一個方式,從變量的生存期來分,可將變量分為動態存儲變量及靜態存儲變量。
動態存儲變量可以是函數的形式參數、局部變量、函數調用時的現場保護和返回地址。
這些動態存儲變量在函數調用時分配存儲空間,函數結束時釋放存儲空間。動態存儲變量的定義形式為在變量定義的前面加上要害字“auto”,例如:
auto int a,b,c;
“auto”也可以省略不寫。事實上,我們已經使用的變量均為省略了要害字“auto”的動態存儲變量。有時我們甚至為了提高速度,將局部的動態存儲變量定義為寄存器型的變量,定義的形式為在變量的前面加要害字“register”,例如:
register int x,y,z;
這樣一來的好處是:將變量的值無需存入內存,而只需保存在CPU內的寄存器中,以使速度大大提高。由于CPU內的寄存器數量是有限的,不可能為某個變量長期占用。因此,一些操作系統對寄存器的使用做了數量的限制?;蚨嗷蛏伲蚋静惶峁?,用自動變量來替代。
4.2.4靜態存儲變量
在編譯時分配存儲空間的變量稱為靜態存儲變量,其定義形式為在變量定義的前面加上要害字“static”,例如:
static int a=8;
定義的靜態存儲變量無論是做全程量或是局部變量,其定義和初始化在程序編譯時進行。
作為局部變量,調用函數結束時,靜態存儲變量不消失并且保留原值。
C語言函數的作用域規則(圖四)
從上述程序看,函數f()被三次調用,由于局部變量x是靜態存儲變量,它是在編譯時分配存儲空間,故每次調用函數f()時,變量x不再重新初始化,保留加1后的值,得到上面的輸出。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美在线一区| 深夜成人在线观看| 久操成人在线视频| 岛国av午夜精品| 精品国产福利在线| 亚洲国产精品嫩草影院久久| 18性欧美xxxⅹ性满足| 亚洲xxxxx| 久久久精品久久久久| 久久久中精品2020中文| 97香蕉久久超级碰碰高清版| 欧美极品在线视频| 国产成人久久久精品一区| 国产日韩中文在线| 国产精品成人av性教育| 日韩精品免费在线视频观看| 青青青国产精品一区二区| 欧美寡妇偷汉性猛交| 国产精品福利片| 日韩在线www| 日韩美女在线播放| 日韩免费在线电影| 亚洲一区二区三区四区在线播放| 555www成人网| 奇米影视亚洲狠狠色| 亚洲精品一区av在线播放| 亚洲毛片在线观看| 国色天香2019中文字幕在线观看| 91免费综合在线| 欧美一级视频在线观看| 久热精品视频在线免费观看| 欧美性猛交xxxx乱大交| 96精品视频在线| 欧美乱人伦中文字幕在线| 国产精品久久中文| 亚洲毛茸茸少妇高潮呻吟| 久久久久久国产精品久久| 国产精品96久久久久久| 日韩欧美主播在线| 九九精品视频在线观看| 91精品久久久久久久| 亚洲欧洲xxxx| 欧美色视频日本高清在线观看| 精品国模在线视频| 91sao在线观看国产| 亚洲男人天堂久| 久久在精品线影院精品国产| 日韩国产精品亚洲а∨天堂免| 久久免费少妇高潮久久精品99| 亚洲成人激情小说| 国产福利精品视频| 日韩在线免费高清视频| 疯狂蹂躏欧美一区二区精品| 国产综合福利在线| 国产精品福利片| 国产精品99久久久久久白浆小说| 亚洲欧美一区二区三区情侣bbw| 欧美激情国产精品| 欧美一级淫片videoshd| 亚洲最大成人在线| 国产欧美一区二区三区视频| 精品久久久91| 992tv成人免费影院| 亚洲老板91色精品久久| 亚洲女人初尝黑人巨大| 欧美日韩综合视频| 成人免费在线网址| 国产成人自拍视频在线观看| 狠狠久久五月精品中文字幕| 国产成人黄色av| 国产精品主播视频| 国产在线精品一区免费香蕉| 精品久久久久久国产| 亚洲性av在线| 国产成人欧美在线观看| 亚洲精品国产电影| 国内伊人久久久久久网站视频| 日韩女优人人人人射在线视频| 久久久综合免费视频| 亚洲电影在线观看| 久久人91精品久久久久久不卡| 亚洲永久在线观看| 久久人人爽人人爽人人片av高请| 国产精品视频网| 成人情趣片在线观看免费| 久久深夜福利免费观看| 午夜精品一区二区三区视频免费看| 久久久亚洲福利精品午夜| 亚洲美女视频网| 国产精品看片资源| 日韩亚洲综合在线| 青青久久aⅴ北条麻妃| 日韩精品免费在线视频| 日本国产欧美一区二区三区| 黄色91在线观看| 日韩高清av在线| 在线观看亚洲区| 这里精品视频免费| 日韩精品久久久久久福利| 国产成人一区二区三区| 精品丝袜一区二区三区| 欧美精品一区二区三区国产精品| 久久激情视频免费观看| 久久亚洲精品中文字幕冲田杏梨| 国产精品日韩久久久久| 91高清在线免费观看| 亚洲色图13p| 国产亚洲精品va在线观看| 国产一区二区三区视频| 奇米影视亚洲狠狠色| 亚洲国产日韩一区| 2019日本中文字幕| 欧美电影免费观看| 亚洲色图50p| 精品视频在线播放| 国产91色在线免费| 亚洲在线第一页| 久久男人的天堂| 色无极亚洲影院| 国产在线高清精品| 日韩美女视频免费在线观看| 亚洲欧美在线一区| 久久久久久久久久av| 国产成人精品久久| 国产人妖伪娘一区91| 啊v视频在线一区二区三区| 欧美裸体视频网站| 亚洲人午夜色婷婷| 久久国产精品久久久久| 国产欧美日韩亚洲精品| 国产a级全部精品| 正在播放亚洲1区| 欧美疯狂做受xxxx高潮| 久久视频在线观看免费| 日韩电影中文字幕在线| 国产成人精品一区二区| 国产精欧美一区二区三区| 国产成人精品免高潮费视频| 国产在线拍揄自揄视频不卡99| 91免费福利视频| 欧美日韩亚洲视频| 菠萝蜜影院一区二区免费| 亚洲精品女av网站| 国产成人黄色av| 91精品国产91久久久久久最新| 国产在线精品一区免费香蕉| 亚洲a级在线观看| 国产精品老牛影院在线观看| 国产精品99久久久久久白浆小说| 日韩欧美在线视频日韩欧美在线视频| 美女视频黄免费的亚洲男人天堂| 色哟哟网站入口亚洲精品| 成人免费观看49www在线观看| 日韩av中文字幕在线免费观看| 久久久久久国产三级电影| 国产成人亚洲综合青青| 少妇高潮久久77777| 55夜色66夜色国产精品视频| 欧美电影《睫毛膏》| 深夜福利国产精品| 国产专区欧美专区| 欧美一级淫片丝袜脚交| 国产成人精品在线| 亚洲欧美国内爽妇网|