2010-07-24 119 views
2

我在靜態integer.When的概念的混亂我初始化即混淆靜態變量

static int i; 

現在靜態整數在下一步驟分配一個值0.Now在主功能的靜態整數:

i++; 

i變爲1

現在該程序終止。我想知道下一次運行會產生什麼樣的程序。另外,如果整個程序關閉,會發生什麼?我知道第一行是static int i;因此下一次運行函數時的下一個值應該保留之前運行時的值。如果是這樣,做一個可變靜態的優點是什麼?變量是否有時間限制或可以永久存儲?如果我再次運行該函數,值會是多少?

+2

如果你調用i + 1,'i'不會變成'1'。 – kennytm 2010-07-24 08:07:45

+0

好的!我編輯了我的問題:)。謝謝 – 2011-02-10 17:33:20

回答

5

在C中, 「靜態」 意味着變量具有全局存儲內的局部範圍。

C中變量的作用域是一個塊。換句話說,變量可以在聲明的塊內部使用。通常他們只是保留自己的價值,直到塊結束,之後就會丟失。例如:

{ 
    int a; 
    // Only a can be used here 
    { 
     int b; 
     // a and b can be used here 
     { 
     int c; 
     // a,b and c can be used here 
     } 
     //just a and b can be used here. c is not available anymore 
    } 
    // only a can be used here. Neither b nor c are available anymore 
} 

除了可以在程序中使用的全局變量以外,這是正確的。

另一個例外是靜態變量。它只在塊內部看到,但在塊結束後保持其值。

這意味着如果你在一個函數中聲明瞭一個靜態變量,它將在函數調用之間保持它的值。

例如,下面的函數有一個局部變量。局部變量有塊的範圍(這意味着你只能訪問變量「VAR」 {}聲明它的塊內,在該情況下,下面的函數內部):

void countFunction(void) 
{ 
    int var = 0; 
    var = var + 1; 
    printf("Value is %d\n", var); 
} 

一旦變量也不是一成不變的,每次調用該函數時,都會打印「值爲1」,因爲該變量存儲在函數調用中分配的堆棧中,並在函數返回後解除分配。

如果更改VAR是靜態的,

void countFunction(void) 
{ 
    static int var = 0; 
    var = var + 1; 
    printf("Value is %d\n", var); 
} 

第一次調用函數VAR將被初始化爲0,功能將顯示「值1」。儘管如此,第二次,VAR已經在全球範圍內分配了。它不會再次初始化,功能將顯示「值爲2」。

這在程序執行中。

儘管只要程序執行時就分配一個靜態變量,但程序結束後程序不會保留其值(程序將釋放所有內存)。爲下一次運行保留任何值的唯一方法是將其存儲在磁盤等非易失性媒體上。

希望它有幫助。

1

當您下次啓動應用程序時,i的值將爲0。初始化爲0是在程序啓動時發生的默認初始化(在C的其餘部分中非常罕見)。

你怎麼想到它會被存儲在執行之間的任何地方?只要您的應用程序終止,它的內存將被操作系統回收。因此存儲i的內存塊也會丟失。

3

這將是0再次因爲終止程序的所有內存/變量都將丟失。

究竟什麼是使它 靜態的優勢在哪裏?

它是隻要你不終止程序:)例如,它可以被用來算多少次,如果你在函數中使用靜態變量的函數被調用,每次調用增加它有用。這只是一個簡單的例子,但當然可以有更多的實際用途。

多個讀數:

C Static Variables