官术网_书友最值得收藏!

第38章 逆天改命

  • 程序媛養成計劃
  • 任煦之秋
  • 2045字
  • 2020-05-10 21:31:00

老爹話音未落,小弦子就開始發難了。還別說,這個問題還問得真是好,以至于我都有點懷疑老爹是不是又講錯了,因為這好像又有些前后矛盾。

我發現在發生了剛才老爹講錯這件事情后,無論他說什么我都會考慮有沒有問題,因為那種讓大人承認錯誤的感覺,真的是太——爽了。

「哈哈,在回答這個問題之前,我先問你們一個問題。在你們學校應該有校長、年級主任、班主任對吧?」

「嗯~」

我和小弦子對于這個問題雖然感到有些不明所以,但還是齊刷刷地點了點頭。

「吶,校長作用域是整個學校,你們班的事情肯定也能管是吧?」

「嗯~」

「年級主任作用域是你們整個四年級,你們班的事情也能管對吧?」

「沒錯。」

「班主任作用域是你們整個班,管理班上的事情是理所應當的。那么問題來了,如果你們有問題的時候,是去找班主任,或者是年級主任還是直接找校長?」

「肯定是班主任啊,年級主任和校長我們又不熟。」

我撇了撇嘴,有些不滿意老爹問出的這種絲毫沒有水品的問題。一旁的小弦子雖然沒有說話,但也深以為然地點了點頭。

「對了嘛,換句話說,你們和班主任的關系要近一些,其次是年級主任,最后是校長,是這個道理嘛?」

「嗯~」

「其實,你們這種做法專業的來講叫做就近原則。計算機執行程序的時候也一樣啊,它找離當前執行語句最近的那個。這里的近可不是代碼位置的遠近,而是作用域的遠近。

int a = 10;

void funcD(void)

{

int a = 20;

printf(“a =%d“, a);

}

在剛才的例子中,如果執行函數funcD()的話,由于a = 20的這個變量a作用域是整個函數funcD(),如果把函數funcD()比作你們班,那這個a=20這個變量a就相當于你們班主任,a=10那個就是你們的年級主任了,按照你們的說法,printf函數輸出的結果會使用哪個a?」

「a=20」

我和小弦子異口同聲回答道。

「這是你們自己說的哈,錯了可和我沒關系。」

老爹笑了笑。

為了謹慎起見,我和小弦子都寫代碼驗證了一下,結果果然如同我們所料。

一下子學習了這么多東西,我感覺到很充實。老爹讓我們休息了一個小時,畢竟這些東西還需要我們慢慢去體會、理解。

果然,實踐是檢驗真理的唯一準則。

在這一個小時中,我和小弦子寫了好幾個例程來驗證變量作用域這個問題,然后相互交流了心得。這樣一來,我們對于這個知識點的理解又多了一層。

一連對著電腦這么久,是感覺到有些頭暈腦脹的。于是老爹帶著我們去小區轉了一圈,舒緩一下身體。

「好了,我們繼續說變量的事情。

從我們見過的變量來看,變量分兩種,一種是定義在函數參數列表或者內部,一種定義在函數外部,比如說:

int global = 10;

void funcE(int a)

{

int b = 0;

}

定義在函數參數列表或者內部被稱作局部變量,例如變量a和變量b。而定義在函數外部變量global則被稱為全局變量。

這二者有什么分別呢?

最大的分別自然就是作用域不同,還有就是生命周期不同。作用域咱么就不多講了,現在來說說生命周期。

局部變量的一生是這樣度過的:當調用函數的時候執行它們的聲明語句,這時它們就出生了。然后等到函數執行完,它們就會被無情的殺死。

全局變量就不一樣了,它在程序開始執行時就出生了,要等到整個程序運行結束的時候才是死亡,可以說是與天地同壽。

也就是說,全局變量會一直占用這內存不釋放。因此,我們在聲明一個變量時一定要考慮它的作用域,應該在實現功能的情況下盡量讓其作用域更小,讓其脫離作用域后就釋放,提高內存的使用效率。」

「那這么說來局部變量很可憐,一輩子兢兢業業,任勞任怨,存活的時間還那么短暫。」

我感嘆道。

「誰說不是呢,局部變量就像是你老爹我這樣的為了生活在社會底層屌絲,一輩子任勞任怨,卻又碌碌無為。」

可能是我的話戳中了老爹心中的軟肋,他一下子變得有些傷感。

「當然了,屌絲也有成功逆襲的時候,所以希望還是要有的嘛。」

原本還想安慰一下老爹,沒有到他瞬間又恢復了原來的模樣。

「說到這里,咱們就來說說如何讓可憐而又短命的局部變量成功逆襲,踏上與與天地同壽的人生巔峰。」

老爹突然有讓人振奮的聲音說道。

「……」

我有點無語,感情他剛剛一幅傷感、心酸的模樣就是為了渲染氣氛。

「在關鍵字中有一個叫做static的關鍵,它有兩個作用,其中一個作用就是可以讓局部變量逆天改命,讓它具備與天地同壽的能力。

void funcF(void)

{

static int c = 0;

}

它的用法就是這樣,在函數內部聲明一個局部變量的時候用static修飾它,這樣它就可以與天地同壽了。

除此之外,人生軌跡也發生了變化。

如果沒有static修飾變量c,每次調用funcF()的時候都會執行int = 0這句,然后函數調用完了,它就被殺死了。

但是現在它被static逆天改命了,情況就變得不同了。首先,只有在第一次調用函數funcF()的時候才會執行int c = 0。其次,在funcF()執行結束后,它也不會再被殺死。

等到下一次在執行funcF()的時候,c還保持著上一次的狀態。」

誠如老爹所言,我和小弦子寫代碼驗證了一下,結果和老爹的說法完全一致。

「那static是如何做到為一個變量逆天改命的呢?我看動漫里邊逆天改命都要付出很大的代價。」

我也想問這個問題,沒有想到讓小弦子給領先了。

「這個就涉及到內存分區了。

先前已經跟你們說了,程序要運行需要先被加載到內存中去,這個加載也不是隨便加載的。

運行程序的內存被分成了五個區,它們分別是:代碼區、常量區、全局數據區、堆區、棧區。」

主站蜘蛛池模板: 九江县| 南召县| 海宁市| 仁寿县| 安义县| 湟中县| 太康县| 武定县| 海盐县| 南丰县| 石棉县| 滨海县| 大竹县| 精河县| 乌海市| 清流县| 万全县| 水城县| 房产| 平顶山市| 东光县| 和平区| 通化市| 津南区| 大兴区| 焉耆| 河池市| 大英县| 江津市| 梅州市| 新安县| 石城县| 怀安县| 白朗县| 商城县| 子长县| 泾源县| 阳西县| 怀仁县| 黔江区| 益阳市|