變數的存活週期與static修飾的變數
阿新 • • 發佈:2019-02-06
在C語言或者C++經常需要定義許多的變數,既然定義了一個變數,那麼該變數就肯定有一個作用範圍(存活週期)。在C語言或C++中允許在不同的作用範圍中擁有相同名字的變數。變數按照作用範圍一般分為全域性變數和區域性變數。在函式內定義的一般為區域性變數,在函式外定義的一般為全域性變數。被“{}”圈住的變數則只在其中起作用,例如以下程式:
#include <iostream>
using namespace std;
int main(){
int i = 1; //此處i為main函式中的區域性變數,在整個main函式中有效
cout << i << endl; //輸出結果為1
{
int i = 2; //此處i為‘{}’中的區域性變數只在其中有效
cout << i << endl; //輸出區域性變數i為2
{
i++; //此處i++針對區域性變數i
cout <<i << endl; //輸出為3
}
cout << i <<endl; //仍然輸出為3,上一行改變了區域性變數i的值
}
cout << i << endl; //“{}”結束,區域性變數i凋亡,此處輸出全域性變數i的值1
return 0;
}
輸出結果:
同樣地如果在子函式中定義的變數在main函式中將無法呼叫;在main函式中定義的變數,子函式也無法呼叫。例如:
#include <iostream>
using namespace std;
void f(){
int i = 3;
cout << j; //產生編譯錯誤,j為main函式中的變數
cout << i << endl;
} //函式f結束,變數i隨即凋亡
int main(){
int j = 3;
cout << j;
cout << i; //產生編譯錯誤,i為子函式中的區域性變數,main中無法呼叫
}
如果變數定義在函式體外,則為全域性變數,在整個檔案中均有效,如:
#include <iostream>
using namespace std;
int n = 5; //全域性變數,在以下所用函式中有效
void f(){
cout << n << endl; //合法
}
int main(){
cout << n + 1 << endl; //合法,輸出6
f(); //輸出5
}
輸出結果如下:
子函式如果在main函式中被多次呼叫,則其中定義的變數將被定義,消亡,第二次呼叫時重新被定義,例如:
#include <iostream>
using namespace std;
void f(){
int j = 5;
cout << j << endl; //合法
j++;
}
int main(){
f(); //輸出為5
f(); //輸出仍然為5,第二次呼叫時,j是被第二次定義的,同時被賦值為5
f(); //輸出仍然為5
}
如果想要上面程式中j的值在函式f被呼叫後不凋亡,而是等到下次呼叫時再繼續使用,那麼就需要用到關鍵詞static修飾,將該變數定義為靜態變數,其表示:該變數是靜態變數,函式結束後不會凋亡,等函式下次再被呼叫時,繼續以該值使用,例如:
#include <iostream>
using namespace std;
void f(){
static int j = 5;
cout << j << endl;
j++; //此處j自增後保留供下次呼叫時使用
}
int main(){
f(); //輸出5
f(); //輸出6
f(); //輸出7
}
如有錯誤,歡迎大家批評與指正!