1. 程式人生 > >變數的存活週期與static修飾的變數

變數的存活週期與static修飾的變數

在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
}

如有錯誤,歡迎大家批評與指正!