首頁 現(xiàn)實

程序媛養(yǎng)成計劃

第三十七章 逆天改命

程序媛養(yǎng)成計劃 任煦之秋 2045 2020-05-10 21:31:00

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

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

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

  「嗯~」

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

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

  「嗯~」

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

  「沒錯?!?p>  「班主任作用域是你們整個班,管理班上的事情是理所應(yīng)當(dāng)?shù)?。那么問題來了,如果你們有問題的時候,是去找班主任,或者是年級主任還是直接找校長?」

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

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

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

  「嗯~」

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

  int a = 10;

  void funcD(void)

  {

  int a = 20;

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

  }

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

  「a=20」

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

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

  老爹笑了笑。

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

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

  果然,實踐是檢驗真理的唯一準(zhǔn)則。

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

  一連對著電腦這么久,是感覺到有些頭暈?zāi)X脹的。于是老爹帶著我們?nèi)バ^(qū)轉(zhuǎn)了一圈,舒緩一下身體。

  「好了,我們繼續(xù)說變量的事情。

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

  int global = 10;

  void funcE(int a)

  {

  int b = 0;

  }

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

  這二者有什么分別呢?

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

  局部變量的一生是這樣度過的:當(dāng)調(diào)用函數(shù)的時候執(zhí)行它們的聲明語句,這時它們就出生了。然后等到函數(shù)執(zhí)行完,它們就會被無情的殺死。

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

  也就是說,全局變量會一直占用這內(nèi)存不釋放。因此,我們在聲明一個變量時一定要考慮它的作用域,應(yīng)該在實現(xiàn)功能的情況下盡量讓其作用域更小,讓其脫離作用域后就釋放,提高內(nèi)存的使用效率?!?p>  「那這么說來局部變量很可憐,一輩子兢兢業(yè)業(yè),任勞任怨,存活的時間還那么短暫?!?p>  我感嘆道。

  「誰說不是呢,局部變量就像是你老爹我這樣的為了生活在社會底層屌絲,一輩子任勞任怨,卻又碌碌無為?!?p>  可能是我的話戳中了老爹心中的軟肋,他一下子變得有些傷感。

  「當(dāng)然了,屌絲也有成功逆襲的時候,所以希望還是要有的嘛?!?p>  原本還想安慰一下老爹,沒有到他瞬間又恢復(fù)了原來的模樣。

  「說到這里,咱們就來說說如何讓可憐而又短命的局部變量成功逆襲,踏上與與天地同壽的人生巔峰?!?p>  老爹突然有讓人振奮的聲音說道。

  「……」

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

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

  void funcF(void)

  {

  static int c = 0;

  }

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

  除此之外,人生軌跡也發(fā)生了變化。

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

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

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

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

  「那static是如何做到為一個變量逆天改命的呢?我看動漫里邊逆天改命都要付出很大的代價?!?p>  我也想問這個問題,沒有想到讓小弦子給領(lǐng)先了。

  「這個就涉及到內(nèi)存分區(qū)了。

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

  運行程序的內(nèi)存被分成了五個區(qū),它們分別是:代碼區(qū)、常量區(qū)、全局?jǐn)?shù)據(jù)區(qū)、堆區(qū)、棧區(qū)?!?

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進(jìn)入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設(shè)置
設(shè)置
書架
加入書架
書頁
返回書頁
指南