C語言enum枚舉類型解析


1.基礎 在實際應用中,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只有七種可能取值。在 C 語言中對這樣取值比較特殊的變量可以定義為枚舉類型。所謂枚舉是指將變量的值一一列舉出來,變量只限於列舉出來的值的范圍內取值。 定義一個變量是枚舉類型,可以先定義一個枚舉類型名,然后再說明這個變量是該枚舉類型。 例如: enum weekday{sun,mon,tue,wed,thu,fri,sat}; 定義了一個枚舉類型名 enum weekday,然后定義變量為該枚舉類型。例如: enum weekday day; 當然,也可以直接定義枚舉類型變量。例如: enum weekday{sun,mon,tue,wed,thu,fri,sat} day; 其中,sum,mon,…,sat 等稱為枚舉元素或枚舉常量,它們是用戶定義的標識符。 需要說明的有以下幾點。 ① 枚舉元素不是變量,而是常數,因此枚舉元素又稱為枚舉常量。因為是常量,所以不能對枚舉元素進行賦值。 ② 枚舉元素作為常量,它們是有值的,C 語言在編譯時按定義的順序使它們的值為,1,2,…。 在上面的說明中,sun 的值為 0,mon 的值為 1,…sat 的值為 6,如果有賦值語句 day=mon; 則 day 變量的值為 1。當然,這個變量值是可以輸出的。例如: printf ("%d",day); 將輸出整數 1。 如果在定義枚舉類型時指定元素的值,也可以改變枚舉元素的值。例如: enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day; 這時,sun 為 7,mon 為 1,以后元素順次加 1,所以 sat 就是 6 了。 ③ 枚舉值可以用來作判斷。例如: if (day==mon) {…} if (day>mon) {…} 枚舉值的比較規則是:按其在說明時的順序號比較,如果說明時沒有人為指定,則第一個枚舉元素的值認作 0。例如,mon>sun,sat>fri。 C 語言教程 ?216? ④ 一個整數不能直接賦給一個枚舉變量,必須強制進行類型轉換才能賦值。例如: day=(enum weekday)2; 這個賦值的意思是,將順序號為 2 的枚舉元素賦給 day,相當於workday=tue; 【例 】從鍵盤輸入一個整數,顯示與該整數對應的枚舉常量的英文名稱。 # include void main( ) { enum weekday {sun,mon,tue,wed,thu,fri,sat} day; int k; printf("input a number(0--6)"); scanf("%d",&k); day=(enum weekday)k; switch(day) { case sun: printf("sunday/n");break; case mon: printf("monday/n");break; case tue: printf("tuesday/n");break; case wed: printf("wednesday/n");break; case thu: printf("thursday/n");break; case fri: printf("friday/n");break; case sat: printf("satday/n");break; default: printf("input error/n");break; } } 程序運行結果為: input a number(0--6)1 monday 在該程序中,枚舉常量與枚舉變量可以進行比較,但要輸出枚舉常量對應的英文單詞,不能使用以下語句: printf(" %s",mon); 因為枚舉常量 mon 為整數值,而非字符串。 在使用枚舉變量時,主要關心的不是它的值的大小,而是其表示的狀態。 (1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。 (2) DAY是一個標識符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。 (3) 第一個枚舉成員的默認值為整型的0,后續枚舉成員的值在前一個成員上加1。 (4) 可以人為設定枚舉成員的值,從而自定義某個范圍內的整數。 (5) 枚舉型是預處理指令#define的替代。 (6) 類型定義以分號;結束。 2. 注意:同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。錯誤示例如下所示: 錯誤聲明一:存在同名的枚舉類型 typedef enum { wednesday, thursday, friday } workday; typedef enum WEEK { saturday, sunday = 0, monday, } workday; 錯誤聲明二:存在同名的枚舉成員 typedef enum { wednesday, thursday, friday } workday_1; typedef enum WEEK { wednesday, sunday = 0, monday, } workday_2; 3.使用枚舉型變量 #include enum { BELL = '/a', BACKSPACE = '/b', HTAB = '/t', RETURN = '/r', NEWLINE = '/n', VTAB = '/v', SPACE = ' ' }; enum BOOLEAN { FALSE = 0, TRUE } match_flag; void main() { int index = 0; int count_of_letter = 0; int count_of_space = 0; char str[] = "I'm Ely efod"; match_flag = FALSE; for(; str[index] != '/0'; index++) if( SPACE != str[index] ) count_of_letter++; else { match_flag = (enum BOOLEAN) 1; count_of_space++; } printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE); printf("count of letters: %d %c%c", count_of_letter, NEWLINE, RETURN); } 輸出: match 2 times count of letters: 10 Press any key to continue 4. 枚舉類型與sizeof運算符 #include enum escapes { BELL = '/a', BACKSPACE = '/b', HTAB = '/t', RETURN = '/r', NEWLINE = '/n', VTAB = '/v', SPACE = ' ' }; enum BOOLEAN { FALSE = 0, TRUE } match_flag; void main() { printf("%d bytes /n", sizeof(enum escapes)); //4 bytes printf("%d bytes /n", sizeof(escapes)); //4 bytes printf("%d bytes /n", sizeof(enum BOOLEAN)); //4 bytes printf("%d bytes /n", sizeof(BOOLEAN)); //4 bytes printf("%d bytes /n", sizeof(match_flag)); //4 bytes printf("%d bytes /n", sizeof(SPACE)); //4 bytes printf("%d bytes /n", sizeof(NEWLINE)); //4 bytes printf("%d bytes /n", sizeof(FALSE)); //4 bytes printf("%d bytes /n", sizeof(0)); //4 bytes } 5. 綜合舉例 #include enum Season { spring, summer=100, fall=96, winter }; typedef enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } Weekday; void main() { /* Season */ printf("%d /n", spring); // 0 printf("%d, %c /n", summer, summer); // 100, d printf("%d /n", fall+winter); // 193 Season mySeason=winter; if(winter==mySeason) printf("mySeason is winter /n"); // mySeason is winter int x=100; if(x==summer) printf("x is equal to summer/n"); // x is equal to summer printf("%d bytes/n", sizeof(spring)); // 4 bytes /* Weekday */ printf("sizeof Weekday is: %d /n", sizeof(Weekday)); //sizeof Weekday is: 4 Weekday today = Saturday; Weekday tomorrow; if(today == Monday) tomorrow = Tuesday; else tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM