C言語におけるenum(列挙)の使い方

4398 ワード

最近はデータ構造の広義表を書くときにこの概念を使っていますが、C言語を勉強するときはあまり注意していません.
私はネットでたくさんの資料を結合して、ここで自分でまとめます.
まず、JAVAもC++も列挙タイプがあります.
変数にいくつかの可能な値が必要な場合は、列挙タイプとして定義できます.列挙というのは,変数や呼び出し対象が存在する可能性のある場合を可能な値として一例として挙げることである.  例:
           鉛筆箱の中にペンがありますが、開かないうちに何のペンなのか分かりません.鉛筆かもしれません.万年筆かもしれません.
         ここには2つの可能性があります.では、列挙タイプを定義して表すことができます.
enum box{pencil,pen};

この列挙変数には、鉛筆と万年筆をそれぞれ表す2つの要素も含まれています.ここではpencilとpenとも呼ばれます.
同じプロパティの列挙タイプを持つ2つの変数を定義したい場合は、次の2つの方法で定義できます.
enum box{pencil,pen};  
  
enum box box2;//     box box2;

                  。

enum {pencil,pen}box,box2; //          !

ここは構造体のように見えます.
列挙変数の列挙要素システムは定数で処理されるので列挙定数と呼ばれ、
彼らは普通の算術賦値を行うことができず、(pencil=1;)このような書き込みは間違っています.
しかし、宣言時に付与操作を行うことができます.
 
  enum box{pencil=1,pen=2};

しかし、ここで特に注意しなければならないのは、要素の付与操作を行わないと、要素はシステムによって自動的に0から自動的に増加して付与操作を行います.自動付与といえば、最初の要素だけを定義すると、システムは次の要素に対して前の要素の値に1を加算します.
例:
enum box{pencil=3,pen};//  pen  4       pen=4       !

例:
//    C  
//  
#include <stdio.h>
#include <stdlib.h>
int main()
{
	enum egg{a, b, c};
	enum egg test;
  	test = a;                    //     test        ,       ,          
    switch(test)
	{
		case a:
				printf("test   a
"); break; case b: printf("test b
"); break; case c: printf("test c
"); break; } return 0; }

C++実装:
#include <iostream>  
using namespace std;  
  
int main()  
{  
    enum egg {a,b,c};  
    enum egg test; //         egg test; 
  
     test = c; //     test        ,                                         ,  (test=1;)                ,                 (test = (enum egg) 0;)! 
  
    if (test==c)  
     {  
        cout <<"      :test          c" << endl;  
     }  
  
    if (test==2)  
     {  
        cout <<"      :test       2" << endl;  
     }  
  
    cout << a << "|" << b << "|" << test <<endl;  
  
     test = (enum egg) 0; //       
    cout << "    test    :" << test <<endl;  
    cin.get();
    return 0;
 }

  
            ,            (       )                   !


     
      ,                   。  ,         ,        ,
            。
            ,               。  ,C         “  ”   。
 “  ”                ,     “   ”                。
      ,             ,         ,               。 
                
1.                  : 
enum    {      }; 
               。          。 
     weekday,     7 ,       。     weekday                 。 



2.         
         ,              ,       ,           。 
    a,b,c       weekday,          : 
enum weekday{ sun,mou,tue,wed,thu,fri,sat }; 
enum weekday a,b,c; 
   : 
enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c; 
   : 
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c; 
11.10.2              
             : 


1.       ,    。                。 
     weekday         : 
sun=5; 
mon=2; 
sun=mon; 
     。 


2.                      , 0       0,1,2…。  weekday ,sun  0,mon  1,…,sat  6。 



main(){ 
enum weekday 
{ sun,mon,tue,wed,thu,fri,sat } a,b,c; 
a=sun; 
b=mon; 
c=tue; 
printf("%d,%d,%d",a,b,c); 
} 



  : 
            ,                。 : 
a=sum; 
b=mon; 
    。 : 
a=0; 
b=1; 
    。             ,          。 
 : 
a=(enum weekday)2; 
         2           a,   : 
a=tue; 
                         ,       、   。 

main(){ 
enum body 
{ a,b,c,d } month[31],j; 
int i; 
j=a; 
for(i=1;i<=30;i++){ 
month[i]=j; 
<span><span>j = (</span><span class="keyword">enum</span><span> body) (j + 1);  </span></span> 
if (j>d) j=a; 
} 
for(i=1;i<=30;i++){ 
switch(month[i]) 
{ 
case a:printf(" %2d %c/t",i,'a'); break; 
case b:printf(" %2d %c/t",i,'b'); break; 
case c:printf(" %2d %c/t",i,'c'); break; 
case d:printf(" %2d %c/t",i,'d'); break; 
default:break; 
} 
} 
printf("/n"); 
}