一、淺談變數
變數分為全域變數和區域變數,如何簡單地區別它們呢?很簡單:全域變數是定義在大括號之外的,而區域變數是定義在大括號里面的,
舉個簡單的栗子:
int a = 0;
int main()
{
int b = 0;
}
此時a是全域變數,而b是區域變數,
當全域變數與區域變數重名時,區域變數優先:
int a = 0;
int main()
{
int a = 10;
printf("%d", a);
}
輸出結果為10;
二、變數的生命周期和static的相關用法
變數的創建到變數的銷毀之間的時間段,叫做生命周期;
全域變數的生命周期是整個程式的生命周期(靜態存盤期);
區域變數的生命周期從進入作用域開始,出作用域結束(自動存盤期);
讓我們從一段代碼入手,感受一下變數的銷毀:
void fun()
{
int a = 1;
a++;
printf("a=%d\n", a);
}
int main()
{
int i = 0;
while (i < 5)
{
fun();
i++;
}
return 0;
}
不妨先看一看,品一品,思考一下結果是什么,
如果你認為是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的一個用法,
static修飾區域變數的作用
想讓上面的代碼成功輸出2,3,4,5,6?不妨在int a=1前加上一個static,
void fun()
{
static int a = 1;//注意這里的變化!!!!
a++;
printf("a=%d\n", a);
}
int main()
{
int i = 0;
while (i < 5)
{
fun();
i++;
}
return 0;
}
int a之前加上static之后,它的生命周期被延長,到整個程式結束的時候,a所在的這塊記憶體才會被系統釋放;那么這個時候,當我們第二次執行fun()函式時,a的值變成2,a++后變成3,然后輸出……最終,我們得到的結果就是:a=2、a=3、a=4、a=5、a=6;
三、相關的雷區
觀察一下代碼:
int main()
{
int count = 0;
int i = 0;
for (i = 1; i <= 2019; i++)
{
while (i)
{
if (i % 10 == 9)
{
count++;
break;
}
i /= 10;
}
}
printf("%d\n", count);
return 0;
}
我們想要利用這段代碼列印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()
{
int count = 0;
int i = 0;
for (i = 1; i <= 2019; i++)
{
int j = i;//這里引入新變數j接收每一次進來的i的值
while (j)
{
if (j % 10 == 9)
{
count++;
break;
}
j /= 10;
}
}
printf("%d\n", count);
return 0;
}
此時得到最終的結果,為544;
小結
以上的例子你是否都做對了呢?如果是,那么恭喜你,你對變數的生命周期還是很敏感的,如果不是,那么還需要在平時的學習中多多注意,多多練習,如果你寫的代碼最終結果不是所想的,說不定就是某個變數的生命周期沒有弄清楚呢,
//創作不易,留個贊再走唄~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259179.html
標籤:其他
上一篇:【鎖】如何實作死鎖
