在 C 語言中經(jīng)常會見到 enum、sizeof、typedef,那么我們今天就來講解下它們三個。
成都創(chuàng)新互聯(lián)服務項目包括平遙網(wǎng)站建設、平遙網(wǎng)站制作、平遙網(wǎng)頁制作以及平遙網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,平遙網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到平遙省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!首先 enum 是 C 語言中的一種自定義類型,它是一種枚舉類型。enum 值是可以根據(jù)需要自定義的整型值,第一個定義的 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,然后創(chuàng)建數(shù)組并打印。我們來看下編譯結果是否如我們所愿呢?打印如下:
那么我們看到打印確實如我們所想。
接下來我們來講講 sizeof 關鍵字,它是編譯器的內置指示符,用于計算類型或變量所占內存打小。那么它所計算的值在編譯期就已經(jīng)確定,也就是說在運行期是沒用的。sizeof 于類型時:sizeof(type);用于變量時:sizeof(var) 或 sizeof var。sizeof 是 C語言的內置關鍵字而不是函數(shù),在編譯過程中所有的 sizeof 將被具體的數(shù)值所替換,程序的執(zhí)行過程與 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() 函數(shù),那么照我們的分析,將會在第20行打印出 4,但是在前面硬打印出 hello world 這句話。下來我們來看看是否如我們所分析的那樣呢?
那么這是怎么回事呢?跟我們分析的不一樣,var 不等于 1,并且也沒有打印出 hello world 那句。我們來仔細想想上面講的 sizeof 的相關知識,它是在程序的編譯期有效的,也就是說程序運行之后并沒有去執(zhí)行 var++,所以 var 仍然等于 0。sizeof 是關鍵字而不是函數(shù),所以在程序的第18行并不是去調用 f() 函數(shù),自然也就不會去執(zhí)行函數(shù)里的打印語句。因為函數(shù)的返回值是 int 型,所以打印的值為 4。
最后我們再來講講 typedef 關鍵字。我們通常以為 typedef 是定義一種新的類型,其實不是的。typedef 用于給一個已經(jīng)存在的數(shù)據(jù)類型重命名,其本質上是不能產(chǎn)生新的類型的。注意:它命名的類型可以在 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;我們來看看編譯結果
那么我們注釋掉第28行之后,編譯就通過了。那么我們今天講解了 enum、sizeof、typedef ,總結如下:1、enum 用于定義離散值類型,并且它定義的值是真正意義上的常量;2、sizeof 是編譯器的內置指示符,不參與程序的執(zhí)行過程;3、typedef 用于給類型重命名,并且重命名的類型可以在 typedef 語句之后定義。后面我們會繼續(xù)對 C 語言的學習。
歡迎大家一起來學習 C 語言,可以加我QQ:243343083。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章名稱:C之enum、sizeof、typedef(十一)-創(chuàng)新互聯(lián)
URL分享:http://www.rwnh.cn/article26/dciejg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設、軟件開發(fā)、定制網(wǎng)站、微信公眾號、響應式網(wǎng)站、域名注冊
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)