
局部變量屏蔽全局變量,if_name_==

老鐵們,大家好,相信還有很多朋友對(duì)于局部變量屏蔽全局變量和if_name_==\的相關(guān)問題不太懂,沒關(guān)系,今天就由我來為大家分享分享局部變量屏蔽全局變量以及if_nam...
老鐵們,大家好,相信還有很多朋友對(duì)于局部變量屏蔽全局變量和if_name_==\的相關(guān)問題不太懂,沒關(guān)系,今天就由我來為大家分享分享局部變量屏蔽全局變量以及if_name_==\的問題,文章篇幅可能偏長,希望可以幫助到大家,下面一起來看看吧!
局部變量和全局變量的區(qū)別,怎么實(shí)現(xiàn)
1、作用域不同:全局變量的作用域?yàn)檎麄€(gè)程序,而局部變量的作用域?yàn)楫?dāng)前函數(shù)或循環(huán)等。
2、內(nèi)存存儲(chǔ)方式不同:全局變量存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū)中,局部變量存儲(chǔ)在棧區(qū)。
3、生命期不同:全局變量的生命期和主程序一樣,隨程序的銷毀而銷毀,局部變量在函數(shù)內(nèi)部或循環(huán)內(nèi)部,隨函數(shù)的退出或循環(huán)退出就不存在了。
4、使用方式不同:全局變量在聲明后程序的各個(gè)部分都可以用到,但是局部變量只能在局部使用。函數(shù)內(nèi)部會(huì)優(yōu)先使用局部變量再使用全局變量。
5、編譯器通過語法詞法的分析,判斷出是全局變量還是局部變量。如果是全局變量的話,編譯器在將源代碼翻譯成二進(jìn)制代碼時(shí)就為全局變量分配好一個(gè)虛擬地址(windows下0x00400000以上的地址,也就是所說的全局區(qū)),所以程序在對(duì)全局變量的操作時(shí)是對(duì)一個(gè)硬編碼的地址操做。
局部變量、全局變量、外部變量個(gè)采用什么存儲(chǔ)方式
變量的類別:根據(jù)作用域可分為全局變量和局部變量。根據(jù)生存周期可分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式,具體地又分為自動(dòng)的(auto)、靜態(tài)的(static)、寄存器的(register)、外部的(extern)。
靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式,動(dòng)態(tài)存儲(chǔ)方式是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。
每一個(gè)變量均有作用域和存儲(chǔ)類別兩個(gè)屬性,這些屬性共同用于描述一個(gè)變量,這些不同類型的變量與存儲(chǔ)位置的關(guān)系如下:外部變量(全局變量)、靜態(tài)外部變量、靜態(tài)局部變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)。
自動(dòng)局部變量(局部變量默認(rèn)為自動(dòng)局部變量)、函數(shù)形參存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū),不論是靜態(tài)存儲(chǔ)區(qū)還是動(dòng)態(tài)存儲(chǔ)區(qū)均屬于內(nèi)存中的用戶區(qū)。但是,寄存器變量是存儲(chǔ)在CPU寄存器中的而不是內(nèi)存中。首先說明一下與作用域相關(guān)的幾個(gè)屬性:
局部變量:在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的,這種類型的變量就稱為“局部變量”。
全局變量:在函數(shù)外定義的變量,可以為本源文件中其它函數(shù)所公用,有效范圍為從定義變量的位置開始到本源文件結(jié)束,這種類型的變量就稱為“全局變量”。接下來說明一下與存儲(chǔ)類型相關(guān)的幾個(gè)屬性:
atuo:在聲明局部變量時(shí),若不指定static,默認(rèn)均是auto,這類變量都是動(dòng)態(tài)分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。
static:在聲明局部變量時(shí),使用關(guān)鍵字static將局部變量指定為“靜態(tài)局部變量”,這樣在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即占用的存儲(chǔ)單元不釋放,在下一次函數(shù)調(diào)用時(shí),該變量已有值就是上次函數(shù)調(diào)用結(jié)束時(shí)的值。register:在聲明動(dòng)態(tài)局部變量或者函數(shù)形參時(shí),可將變量聲明為register,這樣編譯系統(tǒng)就會(huì)為變量分配一個(gè)寄存器而不是內(nèi)存空間,通過這種方式可提升對(duì)某些局部變量頻繁調(diào)用的程序的性能。
(寄存器運(yùn)算速度遠(yuǎn)高于內(nèi)存)
extern:用于擴(kuò)展全局變量的作用域,比如如果函數(shù)想引用一個(gè)外部變量,但該外部變量在該函數(shù)后定義,那么這個(gè)函數(shù)需要使用extern來聲明變量,這樣才能使用在該函數(shù)后面定義的全局變量。
此外,extern還可以在多文件的程序中聲明外部變量。由于變量從不同維度劃分,形成了多種錯(cuò)綜復(fù)雜的關(guān)系,在學(xué)習(xí)編程的時(shí)候需要重點(diǎn)關(guān)注。
全局靜態(tài)變量會(huì)在其他函數(shù)中被修改值嗎
對(duì)于全局變量,如果在函數(shù)中修改了值,則全局變量的值就會(huì)被改變,在其他函數(shù)中訪問的就是修改后的值;但是,如果在函數(shù)中定義了跟全局變量名稱一樣的局部變量,則函數(shù)中修改的是局部變量,全局變量的值是無法被修改的。
全局變量的值會(huì)變嗎
對(duì)于全局變量,如果在函數(shù)中修改了值,則全局變量的值就會(huì)被改變,在其他函數(shù)中訪問的就是修改后的值;但是,如果在函數(shù)中定義了跟全局變量名稱一樣的局部變量,則函數(shù)中修改的是局部變量,全局變量的值是無法被修改的。
全局變量和局部變量有什么區(qū)別是怎么實(shí)現(xiàn)的
1、全局變量的作用用這個(gè)程序塊,而局部變量作用于當(dāng)前函數(shù)2、前者在內(nèi)存中分配在全局?jǐn)?shù)據(jù)區(qū),后者分配在棧區(qū)3、生命周期不同:全局變量隨主程序創(chuàng)建和創(chuàng)建,隨主程序銷毀而銷毀,局部變量在局部函數(shù)內(nèi)部,甚至局部循環(huán)體等內(nèi)部存在,退出就不存在4、使用方式不同:通過聲明后全局變量程序的各個(gè)部分都可以用到,局部變量只能在局部使用操作系統(tǒng)和編譯器通過內(nèi)存分配的位置來知道的全局變量分配在全局?jǐn)?shù)據(jù)段,并且在程序被運(yùn)行的時(shí)候就被加載。
編譯器通過語法詞法的分析,判斷出是全局變量還是局部變量。
如果是全局變量的話,編譯器在將源代碼翻譯成二進(jìn)制代碼時(shí)就為全局變量分配好一個(gè)虛擬地址(windows下0x00400000以上的地址,也就是所說的全局區(qū)),所以程序在對(duì)全局變量的操作時(shí)是對(duì)一個(gè)硬編碼的地址操做。
局部變量的話,編譯時(shí)不分配空間,而是以相對(duì)于ebp或esp的偏移來表示局部變量的地址,所以局部變量?jī)?nèi)存是在局部變量所在的函數(shù)被調(diào)用時(shí)才真正分配。
以匯編的角度來看:函數(shù)執(zhí)行時(shí),局部變量在棧中分配,函數(shù)調(diào)用完畢釋放局部變量對(duì)應(yīng)的內(nèi)存,另外局部變量可以直接分配在寄存器中。
操作系統(tǒng)通過變量的分配地址就可以判斷出是局部變量和全局變量。
文章分享結(jié)束,局部變量屏蔽全局變量和if_name_==\的答案你都知道了嗎?歡迎再次光臨本站哦!
本文鏈接:http://www.wzyaohuidianqi.cn/ke/3548.html
