變數分為全域性變數和區域性變數,如何簡單地區別它們呢?很簡單:全域性變數是定義在大括號之外的,而區域性變數是定義在大括號裡面的。
舉個簡單的栗子:
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加以定義後才能成為靜態外部變數,或稱靜態全域性變數。對於自動變數,它屬於動態儲存方式。但是也可...