jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          C-枚舉

          Posted on 2010-11-29 15:10 幻海藍夢 閱讀(925) 評論(0)  編輯  收藏 所屬分類: C語言學習
          在實際應用中,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只
          有七種可能取值。在 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 語言在編譯時按定義的順序使它們的值為
          0,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;
          【例 11.6】從鍵盤輸入一個整數,顯示與該整數對應的枚舉常量的英文名稱。
          # 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 為整數值,而非字符串。
          在使用枚舉變量時,主要關心的不是它的值的大小,而是其表示的狀 態。
          原文; http://www.zs5u.com/Software/C/200901/Software_24620.html
          ------------------------------------------------------------------

          注:以下全部代碼的執行環境為VC++ 6.0

          在程序中,可能需要為某些整數定義一個別名,我們可以利用預處理指令#define來完成這項工作,您的代碼可能是:

          #define MON  1
          #define TUE   2
          #define WED  3
          #define THU   4
          #define FRI    5
          #define SAT   6
          #define SUN   7

           

          在此,我們定義一種新的數據類型,希望它能完成同樣的工作。這種新的數據類型叫枚舉型。

           

          1. 定義一種新的數據類型 - 枚舉型

           以下代碼定義了這種新的數據類型 - 枚舉型

          enum DAY
          {
                MON
          =1, TUE, WED, THU, FRI, SAT, SUN
          };

           

          (1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。

          (2) DAY是一個標識符,可以看成這個集合的名字,是一個可選項,即是 可有可無的項。

          (3) 第一個枚舉成員的默認值為整型的0,后續枚舉成員的值在前一個成員上加1。

          (4) 可以人為設定枚舉成員的值,從而自定義某個范圍內的整數。

          (5) 枚舉型是預處理指令#define的替代。

          (6) 類型定義以分號;結束。

           

          2. 使用枚舉類型對變量進行聲明

          新的數據類型定義完成后,它就可以使用了。我們已經見過最基本的數據類型,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字符型char, 短整型short等等。用這些基本數據類型聲明變量通常是這樣:

          char     a; //變量a的類型均為字符型char
          char     letter;
          int        x,
                     y,
                     z; 
          //變量x,y和z的類型均為整型int
          int       number;
          double  m, n;
          double  result; //變量result的類型為雙精度 浮點型double

           

          既然枚舉也是一種數據類型,那么它和基本數據類型一樣也可以對變量進行聲明。

          方法一:枚舉類型的定義和變量的聲明分開

          enum DAY
          {
                MON
          =1, TUE, WED, THU, FRI, SAT, SUN
          };

           

          enum DAY yesterday;
          enum DAY today;
          enum DAY tomorrow; //變量 tomorrow的類型為枚舉型enum DAY
          enum DAY good_day, bad_day; //變量good_day和bad_day的類型均為枚舉型enum DAY

           

          方法二:類型定義與變量聲明同時進行:

          enum //跟第一個定義不同的是,此處的標號DAY省略,這是允許的。
          {
              saturday,
              sunday 
          = 0,
              monday,
              tuesday,
              wednesday,
              thursday,
              friday
          } workday; 
          //變量workday的類型為枚舉型enum DAY

           

          enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //變量days的類型 為枚舉型enum week

           

          enum BOOLEAN { falsetrue } end_flag, match_flag; //定義枚舉類型并聲明了兩個枚舉型變量

           

          方法三:用typedef關鍵字將枚舉類型定義成別名,并利用該別名進行變量聲明:

          typedef enum workday
          {
              saturday,
              sunday 
          = 0,
              monday,
              tuesday,
              wednesday,
              thursday,
              friday
          } workday; 
          //此處的workday為枚舉型enum workday的別名

           

          workday today, tomorrow; //變量today和tomorrow的類型為枚舉型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的類型為枚舉型workday,也即 enum workday

           

          也可以用這種方式:

          typedef enum workday
          {
              saturday,
              sunday 
          = 0,
              monday,
              tuesday,
              wednesday,
              thursday,
              friday
          };

          workday today, tomorrow; 
          //變量today和tomorrow的類型為枚舉型workday,也即 enum workday

           

          注意:同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能 存在同名的命名常量。錯誤示例如下所示:

          錯誤聲明一:存在同名的枚舉類型

          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. 使用枚舉類型的變量

          3.1 對枚舉型的變量賦值。

          實例將枚舉類型的賦值與基本數據類型的賦值進行了對比:

          方法一:先聲明變量,再對變量賦值

          #include<stdio.h>

          /* 定義枚舉類型 */
          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);
          }

           

          方法二:聲明變量的同時賦初值

          #include <stdio.h>

          /* 定義枚舉類型 */
          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);
          }

           

          方法三:定義類型的同時聲明變量,然后對變量賦值。

          #include <stdio.h>

          /* 定義枚舉類型,同時聲明該類型的三個變量,它們都為全局變量 */
          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
          }

           

          方法四:類型定義,變量聲明,賦初值同時進行。

          #include <stdio.h>

          /* 定義枚舉類型,同時聲明該類型的三個變量,并賦初值。它們都為全局變量 */
          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 對枚舉型的變量賦整數值時,需要進行類型轉換

          #include <stdio.h>

          enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

          void main()
          {
              
          enum DAY yesterday, today, tomorrow;

              yesterday 
          = TUE;
              today 
          = (enum DAY) (yesterday + 1); //類型轉換
              tomorrow = (enum DAY) 30//類型轉換
              
          //tomorrow = 3; //錯誤

              printf(
          "%d %d %d \n", yesterday, today, tomorrow); //輸出:2 3 30
          }

           

          3.3 使用枚舉型變量

          #include<stdio.h>

          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 <stdio.h>

          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<stdio.h>

          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
          }
          原文; http://www.cnblogs.com/JCSU/articles/1299051.html

          主站蜘蛛池模板: 霍邱县| 普陀区| 翼城县| 巨鹿县| 龙岩市| 焦作市| 博湖县| 图们市| 精河县| 长子县| 孟州市| 锡林浩特市| 岫岩| 五河县| 怀远县| 木兰县| 金坛市| 晋州市| 特克斯县| 南郑县| 宜兰市| 伊吾县| 将乐县| 杨浦区| 昌黎县| 儋州市| 乌拉特前旗| 东乌| 桃江县| 二连浩特市| 江达县| 崇左市| 保亭| 古田县| 高州市| 紫阳县| 台南市| 河津市| 丰城市| 德安县| 连江县|