2014-10-09 22 views
0

以外的功能定義的變量,下面是用C語言編寫代碼生活比主

#include<stdio.h> 

int foo() 
{ 
    static int a=0; 
    a=a+1; 
    return a; 
} 

int main() 
{ 
    foo(); 
    foo(); 
    printf("%d",foo()); 
} 

我在Eclipse IDE中編譯使用gcc11這個代碼,我已經得到3我的輸出。

這就是我認爲應該發生的,導致我的輸出爲1不3.

函數調用1:主函數調用函數foo和 控制轉到函數foo,則foo中的變量'a'是 ,其初始值爲零,然後將其增加 1,並將此增量值(1)返回給主函數。 在這一步,爲函數foo創建的變量應該已被銷燬。

函數調用-2:函數調用-1:

函數調用-3:函數調用-1:

在結束時的值由printf函數在main中打印應該是1.

爲什麼程序的輸出是3?

回答

3

有更多的打印嘗試。

#include<stdio.h> 

int foo() 
{ 
    static int a=0; 
    a=a+1; 
    printf("a is now: %d",a); 
    return a; 
} 

int main() 
{ 
    foo(); 
    foo(); 
    printf("%d",foo()); 
} 

您會注意到變量a只是初始化一次,並且其值在函數調用調用中保留。

在這裏看到:http://en.wikipedia.org/wiki/Static_variable

3

static當函數返回時變量不會被銷燬。刪除該關鍵字,它會按預期工作。

編輯: static變量只存在於它自己的函數範圍內。您可以在其他函數中使用相同的名稱(靜態或其他)創建其他變量。

void foo() 
{ 
    static int a = 0; 
    a++; 
    printf("%d\n", a); 
} 

void bar() 
{ 
    int a = 10; 
    a++; 
    printf("%d\n", a); 
} 

void baz() 
{ 
    static int a = 100; 
    a++; 
    printf("%d\n", a); 
} 

int main() 
{ 
    foo(); 
    bar(); 
    baz(); 

    foo(); 
    bar(); 
    baz(); 
    return 0 
} 

這將打印:

1 
11 
101 
2 
11 
102 
+0

這有很大幫助。謝謝! – 2014-10-09 10:19:06

1

這裏,變量a是一個靜態變量。
儘管變量的範圍必須在函數完成執行後結束。但是Static變量在整個程序中都有Scope,它們在整個程序中都不會被刪除。

,如果它在

static int a; 

結果的地方是

int a; 

會有所不同。

1
  • 函數內部的靜態變量在調用之間保持其值。

有關靜態變量和正常變量之間的差異,請參閱下面的示例。

void sample() 
{ 
    int nv = 10;//nv refers normal variable. 
    static int sv = 10;//sv refers static variable. 
    nv += 5; 
    sv += 5; 
    printf("nv = %d, sv = %d\n", nv, sv); 
} 
int main() 
{ 
    int i; 
    for (i = 0; i < 5; ++i) 
    sample(); 
} 

輸出:

nv = 15, sv = 15 
nv = 15, sv = 20 
nv = 15, sv = 25 
nv = 15, sv = 30 
nv = 15, sv = 35