近期在写数据结构的广义表时候用到了这个概念,在学习C语言的时候没有太注意们这里学一下。

我在网上结合了非常多资料,这里自己总结一下。

首先说。JAVA和C++中都有枚举类型。

假设一个变量你须要几种可能存在的值,那么就能够被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也能够说是可能的值一一例举出来。 

比如:

一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔。

这里有两种可能,那么你就能够定义一个枚举类型来表示它!

  1. enum box{pencil,pen};

这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。

假设你想定义两个具有相同特性枚举类型的变量那么你能够用例如以下的两种方式进行定义!

  1. enum box{pencil,pen};
  2.  
  3. enum box box2;//或者简写成box box2;
  4.  
  5.   再有一种就是在声明的时候同一时候定义。
  6.  
  7. enum {pencil,pen}box,box2; //在声明的同一时候进行定义!

这里看起来非常像结构体;

枚举变量中的枚举元素系统是依照常量来处理的。故叫枚举常量

他们是不能进行普通的算术赋值的,(pencil=1;)这种写发是错误的,

可是你能够在声明的时候进行赋值操作!

  1. enum box{pencil=1,pen=2};

可是这里要特别注意的一点是,假设你不进行元素赋值操作那么元素将会被系统自己主动从0開始自己主动递增的进行赋值操作,说到自己主动赋值,假设你仅仅定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作

比如:

  1. enum box{pencil=3,pen};//这里pen就是4系统将自己主动进行pen=4的定义赋值操作。

样例:

  1. //枚举类型C语言
  2. //杨鑫
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main()
  6. {
  7. enum egg{a, b, c};
  8. enum egg test;
  9. test = a; //对枚举变量test进行赋予元素操作,假设不赋值的话,默认是最后一个元素
  10. switch(test)
  11. {
  12. case a:
  13. printf("test的值是a\n");
  14. break;
  15. case b:
  16. printf("test的值是b\n");
  17. break;
  18. case c:
  19. printf("test的值是c\n");
  20. break;
  21. }
  22. return 0;
  23.  
  24. }

C++实现:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. enum egg {a,b,c};
  7. enum egg test; //在这里你能够简写成egg test;
  8.  
  9. test = c; //对枚举变量test进行赋予元素操作。这里之所以叫赋元素操作不叫赋值操作就是为了让大家明确枚举变量是不能直接赋予算数值的。比如(test=1;)这种操作都是不被编译器所接受的,正确的方式是先进行强制类型转换比如(test = (enum egg) 0;)!
  10.  
  11. if (test==c)
  12. {
  13. cout <<"枚举变量推断:test枚举相应的枚举元素是c" << endl;
  14. }
  15.  
  16. if (test==2)
  17. {
  18. cout <<"枚举变量推断:test枚举元素的值是2" << endl;
  19. }
  20.  
  21. cout << a << "|" << b << "|" << test <<endl;
  22.  
  23. test = (enum egg) 0; //强制类型转换
  24. cout << "枚举变量test值改变为:" << test <<endl;
  25. cin.get();
  26. return 0;
  27.  }
  28.  
  29.   
  1. 看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自己主动提升为算术类型的!

  1. 枚举类型
  2. 在实际问题中。有些变量的取值被限定在一个有限的范围内。比如,一个星期内仅仅有七天,一年仅仅有十二个月,
  3. 一个班每周有六门课程等等。
  4.  
  5. 假设把这些量 说明为整型,字符型或其他类型显然是不妥当的。为此。C语言提供了一种称为“枚举”的类型。
  6. 在“枚举”类型的定义中列举出全部可能的取值,被说明为该“枚 举”类型的变量取值不能超过定义的范围。
  7. 应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型。由于它不能再分解为不论什么基本类型。
  8.  
  9. 枚举类型的定义和枚举变量的说明
  10. 1. 枚举的定义枚举类型定义的一般形式为:
  11. enum 枚举名{ 枚举值表 };
  12. 在枚举值表中应罗列出全部可用值。这些值也称为枚举元素。
  13. 该枚举名为weekday。枚举值共同拥有7个,即一周中的七天。凡被说明为weekday类型变量的取值仅仅能是七天中的某一天。
  14.  
  15. 2. 枚举变量的说明
  16. 如同结构和联合一样。枚举变量也可用不同的方式说明。即先定义后说明,同一时候定义说明或直接说明。
  17.  
  18. 设有变量a,b,c被说明为上述的weekday。可採用下述任一种方式:
  19. enum weekday{ sun,mou,tue,wed,thu,fri,sat };
  20. enum weekday a,b,c;
  21. 或者为:
  22. enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
  23. 或者为:
  24. enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
  25. 11.10.2 枚举类型变量的赋值和使用
  26. 枚举类型在使用中有下面规定:
  27.  
  28. 1. 枚举值是常量。不是变量。不能在程序中用赋值语句再对它赋值。
  29.  
  30. 比如对枚举weekday的元素再作下面赋值:
  31. sun=5;
  32. mon=2;
  33. sun=mon;
  34. 都是错误的。
  35.  
  36. 2. 枚举元素本身由系统定义了一个表示序号的数值。从0開始顺序定义为012…。
  37.  
  38. 如在weekday中,sun值为0mon值为1。…,sat值为6
  39.  
  40. main(){
  41. enum weekday
  42. { sun,mon,tue,wed,thu,fri,sat } a,b,c;
  43. a=sun;
  44. b=mon;
  45. c=tue;
  46. printf("%d,%d,%d",a,b,c);
  47. }
  48.  
  49. 说明:
  50. 仅仅能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
  51.  
  52. 如:
  53. a=sum;
  54. b=mon;
  55. 是正确的。而:
  56. a=0;
  57. b=1;
  58. 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
  59. 如:
  60. a=(enum weekday)2;
  61. 其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:
  62. a=tue;
  63. 还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引號。
  64.  
  65. main(){
  66. enum body
  67. { a,b,c,d } month[31],j;
  68. int i;
  69. j=a;
  70. for(i=1;i<=30;i++){
  71. month[i]=j;
  72. <span><span>= (</span><span class="keyword">enum</span><span> body) (+ 1);  </span></span>
  73. if (j>d) j=a;
  74. }
  75. for(i=1;i<=30;i++){
  76. switch(month[i])
  77. {
  78. case a:printf(" %2d %c/t",i,'a'); break;
  79. case b:printf(" %2d %c/t",i,'b'); break;
  80. case c:printf(" %2d %c/t",i,'c'); break;
  81. case d:printf(" %2d %c/t",i,'d'); break;
  82. default:break;
  83. }
  84. }
  85. printf("/n");
  86. }

C语言中的enum(枚举)使用方法的更多相关文章

  1. C语言中的const,free使用方法具体解释

    注意:C语言中的const和C++中的const是有区别的,并且在使用VS编译測试的时候. 假设是C的话.请一定要建立一个后缀为C的文件.不要是CPP的文件. 由于.两个编译器会有区别的. 一.C语言 ...

  2. C语言中malloc函数的使用方法

    C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...

  3. R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不 ...

  4. Django模板语言中的Filters的使用方法

    Filters可以称为过滤器.下面我们简单介绍是如何使用他的. Filters的语法: {{ value|filter_name:参数 }} Django大概提供了六十个内置过滤器,下面我们简单介绍几 ...

  5. Linux-C语言中gettimeofday()函数的使用方法(转载)

    1.简介: 在C语言中可以使用函数gettimeofday()函数来得到时间.它的精度可以达到微妙 2.函数原型: #include<sys/time.h> int gettimeofda ...

  6. linux下C语言中的flock函数使用方法 .

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依參数operation所指 ...

  7. C语言中Union类型的使用方法

    转自:http://blog.csdn.net/feimor/article/details/6858103 使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型, ...

  8. C语言中 fputs() fgets() 的使用方法

    一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针): 其中的n是一个正整数.表示从文件中读出的字符串不超过 n-1 ...

  9. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

随机推荐

  1. MYSQL - 创建数据库时设置编码

    CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE 的语法: CRE ...

  2. ThinkPHP - 查询语句

    public function index(){ // + ----------------------- // | 查询语句 // + ----------------------- // 实例化模 ...

  3. ThinkPHP验证码类

    //ThinkPHP验证码类使用$config = array( 'fontSize' => 30, // 验证码字体大小 'length' => 3, // 验证码位数 'useNois ...

  4. Struts2-ActionContext

    官方解释: The ActionContext is the context in which an {@link Action} is executed. Each context is basic ...

  5. ZOJ 2852 Deck of Cards DP

    题意: 一一个21点游戏. 1. 有三个牌堆,分别为1X,2X,3X. 2. 纸牌A的值为1,纸牌2-9的值与牌面面相同,10(T).J.Q.K的值为10,而而joke(F)的值为 任意大大. 3. ...

  6. POJ 2187 旋转卡壳 + 水平序 Graham 扫描算法 + 运算符重载

    水平序 Graham 扫描算法: 计算二维凸包的时候可以用到,Graham 扫描算法有水平序和极角序两种. 极角序算法能一次确定整个凸包, 但是计算极角需要用到三角函数,速度较慢,精度较差,特殊情况较 ...

  7. HttpResponseRedirect VS HttpResponse

    当我们处理了post提交的数据之后,我们使用HttpResponseRedirect跳转到另一个页面,而不是用HttpResponse. 例如当一个投票环节时使用HttpResponse可以使用浏览器 ...

  8. 不直接访问远程的数据库,而是通过中间件(专业DBA的博客)

    建议不直接访问远程的数据库,而是通过中间件. 或者找到好的加密方式.http://blog.csdn.net/sqlserverdiscovery/article/details/8068318 在S ...

  9. Activity的创建和使用

    Activity: 1:创建一个类继承Activity或者它的子类 public class MainActivity extends Activity { @Override protected v ...

  10. C#验证码的另一种操作方法

    sb = new StringBuilder(); char c = '0'; string s = ""; for (int i = 0; i < 4; i++) { Ra ...