中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

C之 enum、sizeof、typedef(十一)

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

        在 C 語言中經常會見到 enum、sizeof、typedef,那么我們今天就來講解下它們三個。

        首先 enum 是 C 語言中的一種自定義類型,它是一種枚舉類型。enum 值是可以根據需要自定義的整型值,第一個定義的 enum 值默認為 0。默認情況下的 enum 值是在前一個定義值的基礎上加 1,enum 類型的變量只能取定義時的離散值。enum 中定義的值是 C 語言中真正意義上的常量,在一般工程中 enum 多用于定義×××常量。

        下來我們就來寫個示例代碼分析下,代碼如下:

#include <stdio.h>

enum
{
    ARRAY_SIZE = 5
};

void InitArray(int array[])
{
    int i = 0;
    
    for(i=0; i<ARRAY_SIZE; i++)
    {
        array[i] = i + 1;
    }
}

void PrintArray(int array[])
{
    int i = 0;
    
    for(i=0; i<ARRAY_SIZE; i++)
    {
        printf("%d\n", array[i]);
    }
}


int main()
{    
    int array[ARRAY_SIZE] = {0};
    
    InitArray(array);
    
    PrintArray(array);
    
    return 0;
}

        我們來分析下這個代碼,它利用 enum 定義了常量 ARRAY_SIZE,然后創建數組并打印。我們來看下編譯結果是否如我們所愿呢?打印如下:

C之 enum、sizeof、typedef(十一)

        那么我們看到打印確實如我們所想。

        接下來我們來講講 sizeof 關鍵字,它是編譯器的內置指示符,用于計算類型或變量所占內存打小。那么它所計算的值在編譯期就已經確定,也就是說在運行期是沒用的。sizeof 于類型時:sizeof(type);用于變量時:sizeof(var) 或 sizeof var。sizeof 是 C語言的內置關鍵字而不是函數,在編譯過程中所有的 sizeof 將被具體的數值所替換,程序的執行過程與 sizeof 沒用任何關系。我們來看看 下面這個示例代碼會輸出什么?

#include <stdio.h>

int f()
{
    printf("hello world\n");
    
    return 0;
}

int main()
{
    int var = 0;
    
    int size = sizeof(var++);
    
    printf("var = %d, size = %d\n", var, size);
    
    size = sizeof(f());
    
    printf("size = %d\n", size);
    
    return 0;
}

        我們先來分析下這個代碼,在程序的第14行我們做了 var++,理論上第16行打印出來的結果會是 1 和 4。在程序的第18行看似調用了 f() 函數,那么照我們的分析,將會在第20行打印出 4,但是在前面硬打印出 hello world 這句話。下來我們來看看是否如我們所分析的那樣呢?

C之 enum、sizeof、typedef(十一)

        那么這是怎么回事呢?跟我們分析的不一樣,var 不等于 1,并且也沒有打印出 hello world 那句。我們來仔細想想上面講的 sizeof 的相關知識,它是在程序的編譯期有效的,也就是說程序運行之后并沒有去執行 var++,所以 var  仍然等于 0。sizeof 是關鍵字而不是函數,所以在程序的第18行并不是去調用 f() 函數,自然也就不會去執行函數里的打印語句。因為函數的返回值是 int 型,所以打印的值為 4。

        最后我們再來講講 typedef 關鍵字。我們通常以為 typedef 是定義一種新的類型,其實不是的。typedef 用于給一個已經存在的數據類型重命名,其本質上是不能產生新的類型的。注意:它命名的類型可以在 typedef 語句之后,但是不能被 unsigned 和 signed 所修飾

        我們以示例代碼來分析下,代碼如下:

#include <stdio.h>

typedef int Int32;

struct _tag_point
{
    int x;
    int y;
};

typedef struct _tag_point Point;

typedef struct
{
    int length;
    int array[];
} SoftArray; 

typedef struct _tag_list_node ListNode;
struct _tag_list_node
{
    ListNode* next;
};

int main()
{
    Int32 i = -100; 
    unsigned Int32 ii = 0;
    Point p;
    SoftArray* sa = NULL;   
    ListNode* node = NULL;
    
    return 0;
}

        我們來分析這個代碼,我們在第19行顯然是先重命名后定義的,這種在 C 語言中是合法的。第28行用 unsigned 修飾重命名的類型,這顯然是錯誤的,因此會在28行報錯。第29行相當于 struct  _tag_point p;第31行相當于 struct _tag_list_node* node;我們來看看編譯結果

C之 enum、sizeof、typedef(十一)

        那么我們注釋掉第28行之后,編譯就通過了。那么我們今天講解了 enum、sizeof、typedef總結如下:1、enum 用于定義離散值類型,并且它定義的值是真正意義上的常量;2、sizeof 是編譯器的內置指示符,不參與程序的執行過程;3、typedef 用于給類型重命名,并且重命名的類型可以在 typedef 語句之后定義。后面我們會繼續對 C 語言的學習。


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

向AI問一下細節

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

AI

怀仁县| 岫岩| 合川市| 罗定市| 内江市| 射洪县| 东平县| 嘉定区| 乌兰察布市| 新邵县| 礼泉县| 敖汉旗| 神农架林区| 融水| 北宁市| 广德县| 洱源县| 盘山县| 白河县| 靖远县| 社旗县| 蒙阴县| 虹口区| 扎赉特旗| 溧水县| 奇台县| 屏东县| 田东县| 恩施市| 靖宇县| 六盘水市| 彭山县| 辽中县| 呼图壁县| 田阳县| 慈溪市| 疏勒县| 吉林省| 从江县| 竹北市| 新绛县|