變數的生命週期以及static的相關用法

2021-10-19 09:31:32 字數 2474 閱讀 3857

變數分為全域性變數和區域性變數,如何簡單地區別它們呢?很簡單:全域性變數是定義在大括號之外的,而區域性變數是定義在大括號裡面的。

舉個簡單的栗子:

int a =0;

intmain()

此時a是全域性變數,而b是區域性變數。

當全域性變數與區域性變數重名時,區域性變數優先:

int a =0;

intmain()

輸出結果為10;

變數的建立到變數的銷毀之間的時間段,叫做生命週期;

全域性變數的生命週期是整個程式的生命週期(靜態儲存期);

區域性變數的生命週期從進入作用域開始,出作用域結束(自動儲存期);

讓我們從一段**入手,感受一下變數的銷毀:

void

fun(

)int

main()

return0;

}

不妨先看一看,品一品,思考一下結果是什麼。

如果你認為是2,3,4,5,6的話,那麼請仔細看下面的分析哦。

請跟著我的思路:主函式中i=0,此時進入while迴圈,然後又執行fun()函式,函式中定義了乙個變數a,賦值為1,a++後變成2,所以第乙個結果為2,然後回到主函式,i++變成2,再次進入迴圈,執行fun()函式,關鍵部分來了——上一次執行完fun()函式後,變數a就被自動銷毀了,因為它走出了自己預定的作用域,也就是fun()函式的那對大括號,導致我們再次進入fun()函式時,a還是原先的那個1,然後剩下的就和第一次一樣,導致每一次輸出的a都是2;

怎樣改進呢?這牽扯到static的乙個用法。

想讓上面的**成功輸出2,3,4,5,6?不妨在int a=1前加上乙個static。

void

fun(

)int

main()

return0;

}

int a之前加上static之後,它的生命週期被延長,到整個程式結束的時候,a所在的這塊記憶體才會被系統釋放;那麼這個時候,當我們第二次執行fun()函式時,a的值變成2,a++後變成3,然後輸出……最終,我們得到的結果就是:a=2、a=3、a=4、a=5、a=6;

觀察一下**:

int

main()

i /=10;

}}printf

("%d\n"

, count)

;return0;

}

我們想要利用這段**列印1到2019之間,包含9的數字(如19,29,2019…)的個數

當我們這行這段**後我們發現,游標在閃爍但沒有結果輸出,很有可能這個時候,程式死迴圈了,所以我們來除錯一下:

我們開始進入for迴圈,此時初始化後i=1,1≠0,進入while迴圈,1%10等於1而不是9,所以if迴圈進不去,計數器count也就無法增加。

然後執行i/=10(這裡i/=10的作用就是遍歷數字i的每一位)

這時1/10得到0,所以i就等於0了,此時while的判斷為0,第一次while迴圈結束,緊接著就該來到for迴圈的調整部分,也就是i++——

這裡我們想的是,i=1不符合,那麼第二次從i=2開始,但事實上,i的值剛剛經過除10之後,已經變為0,此時再i++,i還是變成1,然後判斷i=1<=2019,進入for迴圈,然後又進入while迴圈……之後就這樣無限迴圈下去了。

怎樣避免這樣的死迴圈發生呢?

於是我們想到,在建立乙個變數 j來接收 i,然後讓 j進入while迴圈,j的值被一次次修改,但此時i的值沒有變,因而我們達到了遍歷1到2019之間所有數字的目的。**如下:

int

main()

j /=10;

}}printf

("%d\n"

, count)

;return0;

}

此時得到最終的結果,為544;

以上的例子你是否都做對了呢?如果是,那麼恭喜你,你對變數的生命週期還是很敏感的,如果不是,那麼還需要在平時的學習中多多注意,多多練習,如果你寫的**最終結果不是所想的,說不定就是某個變數的生命週期沒有弄清楚呢。

//創作不易,留個贊再走唄~

static生命週期

靜態變數的型別說明符是static。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數,例如外部變數雖屬於靜態儲存方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。對於自動變數,它屬於動態儲存方式。但是也可以用static定義它...

static 靜態變數生命週期

靜態變數的型別說明符是static。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數,例如外部變數雖屬於靜態儲存方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。對於自動變數,它屬於動態儲存方式。但是也可以用static定義它...

static 靜態變數生命週期

static生命週期 靜態變數的型別說明符是static。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數,例如外部變數雖屬於靜態儲存方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。對於自動變數,它屬於動態儲存方式。但是也可...