enum 在c中的使用
假设一个变量你须要几种可能存在的值,那么就能够被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也能够说是可能的值一一例举出来。
举个样例来说明一吧,为了让大家更明确一点,比方一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就能够定义一个枚举类型来表示它!
enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。
这里要说一下,假设你想定义两个具有相同特性枚举类型的变量那么你能够用例如以下的两种方式进行定义!
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的定义赋值操作!
前面说了那么多,以下给出一个完整的样例大家能够通过以下的代码的学习进行更完整的学习!
#include <iostream>
using namespace std;
void main(void)
{
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();
}
看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自己主动提升为算术类型的!
#include <iostream>
using namespace std;
void main(void)
{
enum test {a,b};
int c=1+b; //自己主动提升为算术类型
cout << c <<endl;
cin.get();
}
枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。比如,一个星期内仅仅有七天,一年仅仅有十二个月,一个班每周有六门课程等等。假设把这些量 说明为整型,字符型或其他类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出全部可能的取值,被说明为该“枚 举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,由于它不能再分解为不论什么基本类型。
11.10.1 枚举类型的定义和枚举变量的说明
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。
【例11.10】
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;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引號。
【例11.11】
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/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");
}
enum 在c中的使用的更多相关文章
- 引用类中的enum
引用类中的enum 引用类中的enum,需要加类的域class_name::value_in_enum_name 点击(此处)折叠或打开 #include <stdio.h> #inclu ...
- 正确的使用枚举(Enum)
状态与选项的区别(states and options) 在用enum之前,我个人觉得,区分一下状态和选项的概念还是很必要的. 状态,同时只能有一种,如“OK”,“Error”,不可能同时是OK和Er ...
- sql点滴42—mysql中的数据结构
原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...
- C# 中枚举的一点研究(跳过一些net坑的研究而已)
之前一直使用Enum.Parse()将字符串转为枚举,没有深究,后面发现一个问题后对下面的Enum有了一个初步研究(.net 4.0).看下面代码. (留意,枚举类型是值类型,其值不能为Null,所以 ...
- java开发中使用枚举表述数据字典
一.用枚举表述数据字典 1.代码: package com.inspire.jdk.caculate; /** * Created by yaming * 用枚举表述常量数据字段 */ public ...
- ASP.NET MVC和Web API中的Angular2 - 第1部分
下载源码 - 903.5 KB 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索 ...
- C++ Enum 转 Lua Table工具
C++ Enum转Lua Table工具 观察C++ Enum结构 总结结构 enum GameMessage { //******* ///****************** GM_GAMESER ...
- 一览Swift中的常用关键字
要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...
- Java 7 源码学习系列(二)——Enum
Enum Enum类是java.lang包中一个类,他是Java语言中所有枚举类型的公共基类. 一.定义 public abstract class Enum<E extends Enum< ...
随机推荐
- SQL SERVER 实现分组合并实现列数据拼接
需求场景: SQL SERVER 中组织的数据结构是一个层级关系,现在需要抓出每个组织节点以上的全部组织信息,数据示例如下: ADOrg_ID--------------ParentID------- ...
- linux 命令——文件管理 cat
一.介绍 cat 是一个文本文件查看和连接工具.从第一个字节开始正向查看文件的内容. 主要有三大功能: 1.一次显示整个文件.$ cat filename ~,y6;e2.从键盘创建一个文件.$ ...
- XShell 屏幕锁定的恢复方法(Ctrl+Q)
操作XShell过程中很多时间大家会习惯性的按Ctrl+S进行保存. Ctrl+S在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭. 解决方法: 快捷键 Ctrl+Q 即能完成解锁 ...
- asp.net 常用的几种调用存储过程的方法
(1)简单的无参数存储过程 create procedure ExpOneasselect top 10 * from Corpgo C#调用此存储过程 SqlConnection co ...
- LeetCode题解——Regular Expression Matching
题目: 正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次. 解法: 一定要注意'*'必须结合前面的字符一起使用. 代码: class S ...
- 【和我一起学python吧】Python 启航
话说万张高楼平地起,不会走之前先学会爬吧.尤其对于我等的小菜同学来说更是这样,不管怎么先code first吧,等我等小菜们翅膀硬了才test first吧. 1, 怎么运行python? 先到pyt ...
- 更换Oracle备份数据文件
应用背景:需要查看和修改一下Interlib中的数据,所以要反复的将备份数据进行导入和清空.整理一下步骤 删除tablespace drop tablespace interlib including ...
- Spark Streaming 架构
图 1 Spark Streaming 架构图 组件介绍: Network Input Tracker : 通 过 接 收 器 接 收 流 数 据, 并 将 流 数 据 映 射 为 输 入DSt ...
- Xshell异常断开
这可能是由于 SSH 超时断开连接 导致的!可以这样做...修改/etc/ssh/sshd_config文件,找到 ClientAliveInterval 0和ClientAliveCountMax ...
- 一个word合并项目的分布式架构设计
一个word合并项目的分布式架构设计 项目背景与问题起源 我们要给一个客户做word生成报告以及报告合并的工作,要合并的报告非常多,而且每个报告也比较大,一个多的报告大概有200页以上.我们用c#操作 ...