2011-10-03 65 views
6

有人能夠準確地解釋C中變量的範圍和生命的概念嗎?它在C++中有什麼不同?我對範圍和生活感到困惑。範圍與變量的生命期C

+0

如何acept答案嗎? – vikky

回答

5

作用域是變量可訪問的區域。
生命期是對象保持有效的時間跨度。

一個簡單的例子:

#include <iostream.h> 

void doSomething() 
{ 
    x = 5; //Error! Not Accessible 
} 

int main() 
{ 

     int x = 4; 
     std::cout<< x << endl; 
     { 
      int x = 2; 
      cout << x << endl; 
     } 
     doSomething(); 
     std::cout<< x << endl; 
     return 0; 
} 

上面給出的輸出:

在上述程序中,
壽命可變x = 4的是t遍歷主體,即:在整個主體執行過程中保持活動狀態,也可以在主體中訪問,也就是它的範圍。請注意,該功能無法訪問,因爲它超出了變量x的範圍。

而範圍和變量x = 2的使用壽命是在內部包圍括號{}

+0

「仍然有效」是指「使用中」?它如何影響變量的範圍? –

+0

@ R.MartinhoFernandes:好吧,談論變量的生命週期並不正確,因爲變量是一個對象。我記得標準將變量定義爲命名對象。然而,我現在可能沒有意義,可能是因爲一些SO歷史修訂刪除了你的評論的原始上下文? –

+1

繼續Alf的評論:一個變量是一個符號(名稱)和一個對象的關聯。生命週期涉及的對象(只有對象);範圍涉及的符號(只有符號)。 –

20

變量的「範圍」是源代碼的一個區域,您可以在其中引用該變量。

「生命期」是指程序執行過程中存在的時間。

通過默認的本地變量的生存期相同的範圍:

void foo() 
{ 
    int x = 123; 
    cout << x << endl; 
    x += 1; 
} 

int main(){ foo(); foo(); foo(); } 

在這裏,每個時間foo被稱爲新x創建(空間保留給它在堆棧上),並當執行離開x的塊時,x被銷燬(int只是意味着保留的空間現在被釋放以供再次使用)。

相反:

void foo() 
{ 
    static int x = 123; 
    cout << x << endl; 
    x += 1; 
} 

int main(){ foo(); foo(); foo(); } 

這裏,因爲x聲明static,空間保留給x程序執行,甚至開始之前。 x在內存中有一個固定位置,它是一個靜態變量。而且C++對這樣一個變量的初始化有特殊的規則:它在執行首次通過聲明時發生。

因此,在第一次調用foo時,此x被初始化,輸出語句顯示123,並且增量將值增加1.在下一次調用中,跳過初始化(它已經執行),值124被輸出,並且該值再次增加。等等。

x的生存期從開始執行到結束執行。

0

在編譯時確定變量的範圍。這是程序中的區域,通過該標識符可以訪問,通過該標識符可以訪問相同的對象。

對象的生命週期是一個在運行時通過執行流定義的功能。即使通過指針定義的變量不在範圍內,也可以通過指針訪問對象。

void f(char *a) { 
    *a = 'f'; 
} 

void g(void) { 
    char aChar = ' '; 
    f(&aChar); 
} 

這裏變量aChar(標識符)的範圍的g身體。執行g期間,對象的生命週期擴展爲執行f。使用標識aCharf是不合法的,編譯器會告訴你什麼「未知indetifier aChar在功能f」。如上所述使用指向該對象的指針是完全合法的。

0

變量的範圍指的是程序的不同部分訪問變量的程度。 變量可以聲明爲:

  • 裏面一個被稱爲局部變量和內部變量函數。

  • 的被稱爲全局變量或外部變量和壽命或「範圍」的所有功能之外整個計劃的整個行程上延伸。

下面是有關變量的詳細教程,範例:What is variable in C

+0

每個問題的範圍與生活情況如何? – J0e3gan

+0

範圍 - 定義程序的哪些部分可以訪問變量生命週期 - 定義何時創建和銷燬變量 –