91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C之變量屬性(五)

發布時間:2020-07-04 11:47:01 來源:網絡 閱讀:809 作者:上帝之子521 欄目:編程語言

        我們知道以在 C 語言中的變量有自己的屬性,只要在定義變量的時候加上“屬性”關鍵字即可。“屬性”關鍵字指明變量的特有意義。

        語法:property type var_name;比如:auto int i; register int j;extern float k;static double m;

        auto 關鍵字:它是 C 語言中局部變量的默認屬性;表明將被修飾的變量存儲于棧上;編譯器默認所有的局部變量都是 auto 的。

        register 關鍵字:指明將局部變量存儲于寄存器中;只是請求寄存器變量,但不一定請求成功;register 變量的必須是 CPU 寄存器可以接受的值;不能用 &  運算符獲取 register 變量的地址。

        static 關鍵字:指明變量的“靜態”屬性,static 修飾的局部變量存儲在程序靜態區;它同時具有“作用域限定符”的意義,static 修飾的全局變量作用域只是聲明的文件中,修飾的函數作用域只是在聲明的文件中。

        下來我們做個實驗分析下,代碼如下:

#include <stdio.h>

int f1()
{
    int r = 0;
    
    r++;
    
    return r;
}

int f2()
{
    static int r = 0;
    
    r++;
    
    return r;
}


int main()
{
    auto int i = 0;       // 顯示聲明 auto 屬性,i 為棧變量
    static int k = 0;     // 局部變量 k 的存儲區位于靜態區,作用域位于 main 中
    register int j = 0;   // 向編譯器申請將 j 存儲于寄存器中

    printf("%p\n", &i);
    printf("%p\n", &k);
    printf("%p\n", &j);   // error
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", f1());
    }
    
    printf("\n");
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", f2());
    }
    
    return 0;
}

         我們可以看出第 30 行代碼會出錯,因為不能用 &  運算符獲取 register 變量的地址。編譯如下:

C之變量屬性(五)

        我們注釋掉那行代碼之后,再次編譯,得到結果如下:

C之變量屬性(五)

        我們發現雖然 i 和 k 是挨著定義的,但是因為屬性不同,所以他倆的地址也差的好大。再接著看 f1() 和 f2() 基本上都差不多,但是打印結果卻差別很大呢?仔細看看在 f2() 中,我們加了 static 關鍵字。也就是說 f1() 中的 r 是局部變量,在每次執行循環的時候都要進行初始化為0,所以打印五次結果都為 0;但 f2() 不同,r 前面加有 static,所以其相當于全局變量,在循環時只進行一次的初始化,后面的循環便依次加一了。

        接下來我們來介紹 extern 關鍵字:它是用于聲明“外部”定義的變量和函數,extern 變量在文件的其他地方分配空間extern 函數在其他地方定義;它用于“告訴”編譯器用 C 的方式進行編譯,C++ 編譯器和一些變種 C  編譯器默認會按“自己”的方式編譯函數和變量,通過 extern C 關鍵字可以命令編譯器“以標準 C 方式進行編譯”。

        下來我們就來驗證下,代碼如下:

#include <stdio.h>

extern int getI();

int main()
{
    printf("%d\n", getI());
       
    return 0;
}

        g.c 代碼如下:

static int g_i;

int getI()
{
    return g_i;
}

        我們編譯得到結果如下:

C之變量屬性(五)

        雖然我們沒在 test.c 文件中定義 getI(),但是我們在 main() 之前進行 extern 聲明,編譯器在編譯到這時會先向下編譯然后再 g.c 文件中進行尋找。最后成功執行 getI(),getI() 返回的是一個 static 修飾的全局變量,默認為 0。所以最后結果為 0。

        那么我們本次學習了變量的屬性,auto 變量存儲在程序的棧中,默認屬性;static 變量存儲在程序靜態區中;register 變量請求存儲于 CPU 寄存器中;extern 變量在文件的其他地方分配空間,extern 能夠指示其他編譯器按照標準 C 方式編譯程序。


        歡迎大家一起來學習 C 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

威海市| 龙州县| 和顺县| 陈巴尔虎旗| 荔波县| 庆云县| 汉沽区| 广安市| 兴山县| 宝应县| 云龙县| 连云港市| 本溪| 清新县| 句容市| 周口市| 漾濞| 漳平市| 瓮安县| 喀喇| 青海省| 肥西县| 孝昌县| 巩义市| 博白县| 琼海市| 修水县| 姜堰市| 股票| 天祝| 库伦旗| 黔西| 新河县| 江北区| 宁化县| 唐河县| 三门峡市| 和龙市| 康马县| 团风县| 周至县|