C語(yǔ)言 | 您所在的位置:網(wǎng)站首頁(yè) › 屬蛇男性格脾氣怎樣 › C語(yǔ)言 |
原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改動(dòng) C語(yǔ)言詳解 - 枚舉類(lèi)型 注:以下全部代碼的執(zhí)行環(huán)境為VC++ 6.0 在程序中,可能需要為某些整數(shù)定義一個(gè)別名,我們可以利用預(yù)處理指令#define來(lái)完成這項(xiàng)工作,您的代碼可能是: #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7 在此,我們定義一種新的數(shù)據(jù)類(lèi)型,希望它能完成同樣的工作。這種新的數(shù)據(jù)類(lèi)型叫枚舉型。 1. 定義一種新的數(shù)據(jù)類(lèi)型 - 枚舉型 以下代碼定義了這種新的數(shù)據(jù)類(lèi)型 - 枚舉型 enum DAY { ????MON=1, TUE, WED, THU, FRI, SAT, SUN }; (1) 枚舉型是一個(gè)集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號(hào),隔開(kāi)。 (2) DAY是一個(gè)標(biāo)識(shí)符,可以看成這個(gè)集合的名字,是一個(gè)可選項(xiàng),即是可有可無(wú)的項(xiàng)。 (3) 第一個(gè)枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個(gè)成員上加1。 (4) 可以人為設(shè)定枚舉成員的值,從而自定義某個(gè)范圍內(nèi)的整數(shù)。 (5) 枚舉型是預(yù)處理指令#define的替代。 (6) 類(lèi)型定義以分號(hào);結(jié)束。 C語(yǔ)言深度解剖: 一般的定義方式如下:enum enum_type_name{???ENUM_CONST_1,???ENUM_CONST_2,???...???ENUM_CONST_n} enum_variable_name; 注意:enum_type_name 是自定義的一種數(shù)據(jù)數(shù)據(jù)類(lèi)型名,而enum_variable_name 為enum_type_name類(lèi)型的一個(gè)變量,也就是我們平時(shí)常說(shuō)的枚舉變量。實(shí)際上enum_type_name類(lèi)型是對(duì)一個(gè)變量取值范圍的限定,而花括號(hào)內(nèi)是它的取值范圍,即enum_type_name 類(lèi)型的變量enum_variable_name 只能取值為花括號(hào)內(nèi)的任何一個(gè)值,如果賦給該類(lèi)型變量的值不在列表中,則會(huì)報(bào)錯(cuò)或者警告。ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,這些成員都是常量,也就是我們平時(shí)所說(shuō)的枚舉常量(常量一般用大寫(xiě))。 ? 2. 使用枚舉類(lèi)型對(duì)變量進(jìn)行聲明 新的數(shù)據(jù)類(lèi)型定義完成后,它就可以使用了。我們已經(jīng)見(jiàn)過(guò)最基本的數(shù)據(jù)類(lèi)型,如:整型int, 單精度浮點(diǎn)型float, 雙精度浮點(diǎn)型double, 字符型char, 短整型short等等。用這些基本數(shù)據(jù)類(lèi)型聲明變量通常是這樣: char a; //變量a的類(lèi)型均為字符型char char letter; int x,?y,?z; //變量x,y和z的類(lèi)型均為整型int int number; double m, n; double result; //變量result的類(lèi)型為雙精度浮點(diǎn)型double 既然枚舉也是一種數(shù)據(jù)類(lèi)型,那么它和基本數(shù)據(jù)類(lèi)型一樣也可以對(duì)變量進(jìn)行聲明。 方法一:枚舉類(lèi)型的定義和變量的聲明分開(kāi) enum DAY { ????MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum DAY yesterday; enum DAY today; enum DAY tomorrow; //變量tomorrow的類(lèi)型為枚舉型enum DAY enum DAY good_day, bad_day; //變量good_day和bad_day的類(lèi)型均為枚舉型enum DAY 方法二:類(lèi)型定義與變量聲明同時(shí)進(jìn)行: enum //跟第一個(gè)定義不同的是,此處的標(biāo)號(hào)DAY省略,這是允許的。這種方式相當(dāng)于定義了 { ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????一個(gè)枚舉變量,參考 ????saturday, ?????????????????????????????????????????????????????????????????????????????????????????????????????????上面?C語(yǔ)言深度解剖 定義 ????sunday = 0, ????monday, ????tuesday, ????wednesday, ????thursday, ????friday } workday; //變量workday的類(lèi)型為枚舉型enum DAY workday=friday; sizeof(workday)=4; enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //變量days的類(lèi)型為枚舉型enum week enum BOOLEAN { false, true } end_flag, match_flag; //定義枚舉類(lèi)型并聲明了兩個(gè)枚舉型變量 方法三:用typedef關(guān)鍵字將枚舉類(lèi)型定義成別名,并利用該別名進(jìn)行變量聲明: typedef enum?workday ?//此處的workday可以省略,或者改成其他,不會(huì)影響后面 { ????saturday, ????sunday = 0, ????monday, ????tuesday, ????wednesday, ????thursday, ????friday }?workday;?//此處的workday為枚舉型enum workday的別名,類(lèi)似于int workday?today, tomorrow; //此處的workday顏色對(duì)應(yīng),變量today和tomorrow的類(lèi)型為枚舉型workday,也即enum workday enum workday中的workday可以省略: typedef enum { ????saturday, ????sunday = 0, ????monday, ????tuesday, ????wednesday, ????thursday, ????friday } workday; //此處的workday為枚舉型enum workday的別名 workday today, tomorrow; //變量today和tomorrow的類(lèi)型為枚舉型workday,也即enum workday 也可以用這種方式: typedef enum workday???//VC6.0和MDK編譯均未通過(guò) { ????saturday, ????sunday = 0, ????monday, ????tuesday, ????wednesday, ????thursday, ????friday }; workday today, tomorrow; //變量today和tomorrow的類(lèi)型為枚舉型workday,也即enum workday 注意:同一個(gè)程序中不能定義同名的枚舉類(lèi)型,不同的枚舉類(lèi)型中也不能存在同名的命名常量。錯(cuò)誤示例如下所示: 錯(cuò)誤聲明一:存在同名的枚舉類(lèi)型 typedef enum { wednesday, thursday, friday }?workday; typedef enum WEEK { saturday, sunday = 0, monday, }?workday; 錯(cuò)誤聲明二:存在同名的枚舉成員 typedef enum { wednesday, thursday, friday } workday_1; typedef enum WEEK { wednesday, sunday = 0, monday, } workday_2; 3. 使用枚舉類(lèi)型的變量 3.1 對(duì)枚舉型的變量賦值。 實(shí)例將枚舉類(lèi)型的賦值與基本數(shù)據(jù)類(lèi)型的賦值進(jìn)行了對(duì)比: 方法一:先聲明變量,再對(duì)變量賦值 #include ? enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; void main() { ? int x, y, z; x = 10; y = 20; z = 30; ? enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow); } 方法二:聲明變量的同時(shí)賦初值 #include ? enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; void main() { ? int x=10, y=20, z=30; ? enum DAY yesterday = MON,?today = TUE,?tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow); } 方法三:定義類(lèi)型的同時(shí)聲明變量,然后對(duì)變量賦值。 #include ? enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow; ? int x, y, z; void main() { ? x = 10; y = 20; z = 30; ? yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d \n", x, y, z); //輸出:10 20 30 printf("%d %d %d \n", yesterday, today, tomorrow); //輸出:1 2 3 } 方法四:類(lèi)型定義,變量聲明,賦初值同時(shí)進(jìn)行。 #include ? enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday = MON, today = TUE, tomorrow = WED; ? int x = 10, y = 20, z = 30; void main() { ????printf("%d %d %d \n", x, y, z); //輸出:10 20 30 ????printf("%d %d %d \n", yesterday, today, tomorrow); //輸出:1 2 3 } 3.2 對(duì)枚舉型的變量賦整數(shù)值時(shí),需要進(jìn)行類(lèi)型轉(zhuǎn)換。 #include enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; void main() { ????enum DAY yesterday, today, tomorrow; ????yesterday = TUE; ????today = (enum DAY) (yesterday + 1); //類(lèi)型轉(zhuǎn)換 ????tomorrow = (enum DAY) 30; //類(lèi)型轉(zhuǎn)換 ????//tomorrow = 3; //錯(cuò)誤 ????printf("%d %d %d \n", yesterday, today, tomorrow); //輸出:2 3 30 } ? 問(wèn)題: enum Color { GREEN = 1, RED, BLUE, GREEN_RED = 10, GREEN_BLUE }ColorVal;? 1.枚舉能做到事,#define宏能不能都做到?如果能,那為什么還需要枚舉? 2.求sizeof(ColorVal) 枚舉可以自增1,這樣不用每一個(gè)值都定義,而宏必須每個(gè)值都定義。而且枚舉是一個(gè)集合,代表一類(lèi)值,像你代碼中的顏色歸為一類(lèi),方便使用,而宏不能形成集合。 sizeof(ColorVal)是4,因?yàn)镃olorVal是一個(gè)枚舉變量,而枚舉變量代表一個(gè)整數(shù)(如ColorVal = RED),而整數(shù)是4個(gè)字節(jié)。 |
今日新聞 |
推薦新聞 |
專(zhuān)題文章 |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |