C Primer Plus 第12章 12.2 存儲類說明符

C語言中有5個關於存儲類說明符的關鍵字,它們是auto、register、static、extern以及typedef。關鍵字typedef與內存存儲無關,因爲語法緣由被納入此類。特別地,不能夠在一個聲明中使用一個以上存儲類說明符,這意味着不能將其餘任一存儲類說明符做爲typedef的一部分。小程序

說明符auto代表一個變量具備自動存儲時期。該說明符只能用在具備代碼塊做用域的變量聲明中,而這樣的變量已經擁有自動存儲時期,所以它主要用來明確指出意圖,使程序更易讀。函數

說明符register也只能用於具備代碼塊做用域的變量。它將一個變量納入寄存器存儲類,這至關於請求將該 變量存儲在一個寄存器內,以更快地存取。它的使用也使您不能得到變量的地址。oop

說明符static在用於具備代碼塊做用域的變量的聲明時,使該變量具備靜態存儲時期,從而得以在程序運行期間(即便在包含該變量的代碼塊並無運行時)存在並保留其值。變量仍具備代碼塊做用域和空連接。static在用於具備文件做用域的變量的聲明時,代表該變量具備內部連接。ui

說明符extern代表您在聲明一個已經在別處定義了的變量。若是包含extern的聲明具備文件做用域,所指向的變量必然具備外部連接。若是包含extern的聲明具備代碼塊做用域,所指向的變量可能具備外部連接也可能具備內部連接,這取決於該變量的定義聲明。設計

下面給出了一個使用所有5種存儲類的小程序。它由兩個文件組成,所以您須要多文件編譯。程序的主要目的是使用所有5種存儲類,並不是提供一個設計範例;更好的設計將不須要文件做用域變量。code

程序清單12.5  parta.c文件內存

//parta.c  --各類存儲類
#include <stdio.h>
void report_count();
void accumulate(int k);
int count = 0;    //文件做用域,外部連接
int main(void)
{
    int value;    //自動變量
    register int i;    //寄存器變量

    printf("Enter a positive integer(0 to quit): ");
    while(scanf("%d",&value) == 1 && value > 0)
    {
        ++count;    //使用文件做用域變量
        for (i=value;i>=0;i--)
            accumulate(i);
        printf("Enter a positive integer(0 to quit): ");
    }
    report_count();
    return 0;
}
void report_count()
{
    printf("Loop executed %d times\n",count);
}

程序清單12.6  partb.c 文件作用域

#include <stdio.h>

extern int count;    //引用聲明,外部連接

static int total = 0;     //靜態定義,內部連接
void accumulate(int k)    //原型
void accumulate(int k)    //k具備代碼塊做用域,空連接
{
    static int subtotal = 0;  //靜態,空連接

    if(k<=0)
    {
        printf("loop cycle: %d\n",count);
        printf("subtotal: %d;total: %d\n",subtotal,total);
        subtotal = 0;
    }
    else 
    {
        subtotal += k;
        total += k;
    }
}

在該程序中,具備代碼塊做用域的靜態變量subtotal保存運行時傳遞給函數accumulate()的數值的部分和具備文件做用域、內部連接的變量total保存運行時的總和。一量有非正數傳入,函數accumulate()就報告total和subtotal的值;並在報告時將subtotal重置爲0。parta.c中的函數accumulate()函數原型是必須的,由於函數包含一個accumulate()函數調用。對於partb.c來講,函數原型是可選的,由於這個函數雖然定義了,可是並無在該文件中被調用。函數同時使用外部變量count來記錄main()中的while循環執行了多少次(順便提一下,這是一個什麼狀況下不該使用外部變量的反而例子,由於它使parta.c和partb.c的代碼沒必要要地糾纏在了一塊兒)。在parta.c中,main()和report_count()共享count。原型

下面是一個運行示例:it

Enter a positive integer (0 to quit): 5
loop cycle: 1
subtotal: 15; total: 15
Enter a positive integer (0 to quit): 10
loop cycle: 2
subtotal: 55; total: 70
Enter a positive integer (0 to quit): 2
loop cycle: 3
subtotal: 3; total: 73
Enter a positive integer (0 to quit): 0
loop executed 3 times
相關文章
相關標籤/搜索