C語言extern與static修飾變數
extern和static在C語言裡面的作用這裡就不做過多的闡述了,下面直接通過一個小程式來看一看他們修飾的變數的特性。
#include <stdio.h>
int count = 3;
int main()
{
int i = 0, count = 2, sum = 0;
for (i = 0; i < count; i += 2, count++)
{
static int count = 4;
count++;
if (i % 2 == 0)
{
extern int count;
count++;
sum += count;
}
sum += count;
}
printf("%d %d\n", sum, count);
system("pause");
return 0;
}
看到結果有沒有很驚訝,下面就來通過除錯一步步分析出這個結果:
那麼可以得出:此時count是main函式中for迴圈語句之前定義的區域性變數
執行完40行的語句後,count變為4,說明此時的count為static修飾的count
這兒應該是vs2013的一個bug,因為extern修飾的變數必須是具有外部連結屬性的
可以看到即使我執行了count++,count的值也沒有變化
而執行完sum+=count,sum的值是變成了4,而不是5(此時是執行到了48行,也就是要開始執行第48行,所以不要誤認為是把第二次sum+=count都已經執行了),此時的count值變成5也是正確的了,因為此時的count是static修飾的count(if語句裡的extern修飾的count是一個區域性變數,他的作用域是if語句),為什麼這麼確定,看一看接下來sum值得變化就知道了
因為變數具有區域性優先性,所以這兒的count是static修飾的count,而不是全域性的count或是for迴圈之上的count
接下來就很簡單了,i=2,此時的count=3,那麼迴圈還是可以進去,再執行一次
此時i=4,count=4,二者值相等,所以不再進入迴圈,順序向下執行
所以sum最終為20,那麼輸出sum為20,printf輸出語句輸出的count為4,是因為變數具有區域性優先性,所以這兒的count是for迴圈上面的區域性變數count,值為4