先看兩個簡單的程式,看它們的運行結果
程式1
#include <stdio.h>
void f()
{
char x;
scanf("%c",&x);
if(x=='*'){
printf("%c",x);
}
else{
f();
printf("%c",x);
}
return;
}
int main()
{
f();
return 0;
}
輸入樣例
abc*
輸出樣例
*cba
程式2
#include <stdio.h>
char x;
void f()
{
scanf("%c",&x);
if(x=='*'){
printf("%c",x);
}
else{
f();
printf("%c",x);
}
return;
}
int main()
{
f();
return 0;
}
輸入樣例
abc*
輸出樣例
****
由上面兩個程式可以看出,它們定義的變數是不一樣的,第一個函式的變數x是區域變數,而第二個程式的變數x是全域變數,這就導致了它們的輸出結果不一樣,
分析程式1

上面是進入函式f( )后的運行程序,剛開始輸入x=a,if為假,再次呼叫f( )函式,再次輸入x=b,以此類推下去,到最后if為真時,輸出x= *,再回傳輸出x=c,以此類推下去,最后的到的結果是 *cba,
而由于變數x是區域變數,存放在記憶體的堆疊區,屬于動態存盤類別, 占動態存盤區空間,函式呼叫結束后自動釋放,
如:看上面的流程圖1,當第⑤執行后,則第四個框內的資料都會被系統回收,x的值就看第三個框,變為c,以此下去,直到結束,所以最后的結果并不會跟程式2的結果一樣輸出****,
分析程式2

程式2中的自定義函式f( )與程式1的執行程序差不多,只是變數x變成了全域變數,全域變數存放在記憶體中的靜態區,在該區的資料只有在程式全部執行完之后才會被釋放,
看上面的流程圖2,x是全域變數,所以x放在了靜態區里面,每次激活函式f( )后,輸入的x的值會覆寫前一個x的值,當程式執行到第⑤步執行后,x的值并不會像程式1那樣被系統回收,它會保留下來,當函式進入第三個框內的時候,輸出的x依然是*,以此推下去,因此,程式會輸出****,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/212437.html
標籤:其他
