• 联合与枚举的区别


    联合与枚举老是搞混了,这次记下来,与大家分享。

    enum是枚举型  
    union是联合型,共用体,成员共用一个变量缓冲区 现在基本已经不用了。

    枚举类型 
    在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

     1.1 枚举类型的定义和枚举变量的说明 

      1. 枚举的定义枚举类型定义的一般形式为:     enum 枚举名{ 枚举值表 }; 
        在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
      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;

     1.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;  

               j++; 

               if (j>d) j=a;    

          } 
            for(i=1;i<=30;i++){

               switch(month[i]) 

              { 

              case a:printf(" %2d  %c ",i,'a'); break;

                   case b:printf(" %2d  %c ",i,'b'); break; 

                          case c:printf(" %2d  %c ",i,'c'); break;   

                          case d:printf(" %2d  %c ",i,'d'); break;    

                          default:break;   

        }  

       } 

        printf(" "); 

    联合(union):
    一、联合说明和联合变量定义 
      联合也是一种新的数据类型, 它是一种特殊形式的变量。
      联合说明和联合变量定义与结构十分相似。其形式为:
      union 联合名
      { 
        数据类型 成员名; 
        数据类型 成员名; 
        ... 
      }联合变量名; 
      联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。 
      下例表示说明一个联合a_bc: 
      union a_bc
      { 
        int i; 
        char mm; 
      }; 
      再用已说明的联合可定义联合变量。
      例如用上面说明的联合定义一个名为lgc的联合变量,可写成:
      union a_bc lgc; 
      在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
      当一个联合被说明时, 编译程序自动地产生一个变量,其长度为联合中最大的变量长度。 
      联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时,也要用->符号, 此时联合访问成员可表示成:
      联合名->成员名 
      另外, 联合既可以出现在结构内, 它的成员也可以是结构。
      例如: 
      struct
      { 
        int age; 
        char *addr; 
        union
        { 
          int i; 
          char *ch; 
        }x; 
      }y[10]; 
      若要访问结构变量y[1]中联合x的成员i, 可以写成:
      y[1].x.i; 
      若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
      *y[2].x.ch; 
      若写成y[2].x.*ch;是错误的。

  • 相关阅读:
    回发或回调参数无效。 问题的解决和思考
    母板页中的引用的图片,JS,css等路径问题
    Solution: 题解 CF1196E Connected Component on a Chessboard
    01/05/2020 我注册了博客园 I enrolled in Cnblogs.
    Basic Thought / Data Structure: 前缀和 Prefix Sum
    Basic Thought / Data Structure: 差分 Difference
    DotNet中异步编程(APM)的研究1异步编程介绍
    关于atl server 的感受(3) 一个我自以为豪的应用
    自己的博客,竟然要自己搜出来,太久没来了。
    关于atl server 的感受(2)
  • 原文地址:https://www.cnblogs.com/xianzhedeyu/p/3178489.html
Copyright © 2020-2023  润新知