1. 程式人生 > >C語言extern與static修飾變數

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的值應該為3(黃色箭頭在第45行,說明第44行執行結束,要開始執行第45行了),為什麼我這麼說呢

這裡寫圖片描述

可以看到即使我執行了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