C/C++:[2]enum-枚举量声明、定义和使用
C/C++:[2]enum-枚举量声明、定义和使用
转自:http://jingyan.baidu.com/article/e75aca85526c1b142edac6d9.html
众所周知,C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下enum的使用方法。

工具/原料
Microsoft Visual Studio 2012(或其他版本)
步骤1——枚举量的声明和定义
- 1
首先,请看下面的语句:
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
这句话有两个作用:
第一:声明enumType为新的数据类型,称为枚举(enumeration);
第二:声明Monday、Tuesday等为符号常量,通常称之为枚举量,其值默认分别为0-6。(后面会介绍怎样显式的初始化枚举量的值)
- 2
接着利用新的枚举类型enumType声明这种类型的变量:
enumType Weekday;
就像使用基本变量类型int声明变量一样,如 int a;
然而与基本变量类型不同的地方是,在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,如:
Weekday = Monday;
或者
Weekday = Sunday;
不能将其他值赋给枚举变量,如:
Weekday = 10;
这是不允许的,因为10不是枚举量。
也就是说Weekday只能是定义的Monday-Sunday这些定义过的枚举量。
然而这不是绝对的,第六条会讲到利用强制类型转换将其他类型值赋给枚举变量。
- 3
上面讲不能将非枚举量赋给枚举变量,那么能不能将枚举量赋给非枚举变量呢?如:
int a=Monday;
这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。
- 4
前面讲可以对枚举进行赋值运算,那枚举变量能不能进行算术运算呢?
Weekday++;
Weekday = Monday + Tuesday;
这是非法的,因为这些操作可能导致违反类型限制,比如:
Weekday = Sunday;
Weekday++;
Weekday首先被赋予枚举量中的最后一个值Sunday(值为6),再进行递增的话,Weekday增加到7,而对于enumType类型来说,7是无效的。
总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。
- 5
不能对枚举量进行算术运算,那么枚举量能不能参与其他类型变量的运算呢?
int a;
a = 1 + Monday;
这是允许的,因为编译器会自动把枚举量转换为int类型。
- 6
第二条讲:在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,言下之意就是可以通过强制转换将其他类型值赋给枚举变量:
Weekday = enumType(2);
等同于:
Weekday = Wednesday;
但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么结果?
Weekday = enumType(20);
结果将是不确定的,这么做不会出错,但得不到想要的结果。
END
步骤2——自定义枚举量的值
- 1
前面讲通过定义
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
枚举量Monday、Tuesday等的值默认分别为0-6,我们可以显式的设置枚举量的值:
enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};
指定的值必须是整数!
- 2
也可以只显式的定义一部分枚举量的值:
enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};
这样Monday、Wednesday均被定义为1,则Tuesday=2,Thursday、Friday、Saturday、Sunday的值默认分别为2、3、4、5.
总结:未被初始化的枚举值的值默认将比其前面的枚举值大1。
- 3
第二条还说明另外一个现象,就是枚举量的值可以相同。
END
步骤3——枚举的取值范围
- 1
前面讲到可以通过强制转换将其他类型值赋给枚举变量:
Weekday = enumType(2);
这是合法的;但是
Weekday = enumType(20);是非法的。
这里涉及枚举取值范围的概念:
枚举的上限是 大于最大枚举量的 最小的2的幂,减去1;
枚举的下限有两种情况:一、枚举量的最小值不小于0,则枚举下限取0;二、枚举量的最小值小于0,则枚举下限是 小于最小枚举量的 最大的2的幂,加上1。
举例来讲:
假如定义 enum enumType1 { First=-5,Second=14,Third=10 };
则枚举的上限是16-1=15(16大于最大枚举量14,且为2的幂);
枚举的下限是-8+1=-7(-8小于最小枚举量-5,且为2的幂);
END
步骤4——枚举应用
个人觉得枚举和switch是最好的搭档:
enum enumType{Step0, Step1, Step2}Step=Step0;
//注意这里在声明枚举的时候直接定义了枚举变量Step,并初始化为Step0
switch (Step)
{
case Step0:{...;break;}
case Step1:{...;break;}
case Step2:{...;break;}
default:break;
}
END
注意事项
在实际应用中,枚举常常用来定义符号常量。
自己实现的示例代码如下:
#include <iostream> enum WeekType
{
Sun =,
Mon =,
Tue,
}; void CallWeek(WeekType wk)
{
switch(wk)
{
case Sun:
std::cout<<"周一......"<<std::endl;
break;
case Mon:
std::cout<<"周二......" <<std::endl;
break;
case Tue:
std::cout<<"周三......" <<std::endl;
break;
default:
std::cout<<"Waring......" <<std::endl;
break;
} } int main(int argc,char **argv)
{
WeekType iWk=WeekType::Mon;
int a =WeekType::Tue; switch(a)
{
case :
std::cout<<"周一......"<<std::endl;
break;
case :
std::cout<<"周二......" <<std::endl;
break;
case :
std::cout<<"周三......" <<std::endl;
break;
default:
std::cout<<"Waring......" <<std::endl;
break;
} CallWeek(iWk); return ;
}
C/C++:[2]enum-枚举量声明、定义和使用的更多相关文章
- C++之enum枚举量声明、定义、使用与枚举类详解
C++之enum枚举量声明.定义.使用与枚举类详解 学习一个东西,首先应该指导它能做什么,其次去知道它怎么去做,最后知道为什么去这么做. 知其然知其所以然.不能冒进 ,一步一步的慢慢来.
- 【C/C++开发】C++之enum枚举量声明、定义、使用与枚举类详解与枚举类前置类型声明
众所周知,C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下enum的使用方法. ...
- enum枚举类型的定义
enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, ...
- Enum 枚举类
目录 Enum 枚举类 基础 定义与用途 基本方法 示例 进阶 实现原理 枚举与Class对象 自定义枚举类和构造方法及toString() Enum中使用抽象方法来实现枚举实例的多态性 Enum与接 ...
- [C语言]进阶|结构类型: 枚举, 结构, 类型定义
--------------------------------------------------------------------- 枚举: // main.c #include <std ...
- C enum(枚举)
C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 ...
- C#的Enum——枚举
枚举 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 枚举类型(也称为枚举)为定义一组可以赋给变量的命名整 ...
- C语言--enum,typedef enum 枚举类型详解
原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...
随机推荐
- thinkphp调用phpqrcode.php生成二维码
thinkphp3. 把phpqrcode文件夹放在ThinkPHP\Library\Vendor\下面 phpqrcode下载: http://files.cnblogs.com/files/qho ...
- AgileEAS.NET SOA 中间件2013第四季度发布&部分功能开源预告
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- WPF QuickStart系列之样式和模板(Style and Template)
在WPF桌面程序中,当我们想构建一个统一的UI表现时(在不同操作系统下,显示效果一致),此时我们就需要使用到WPF中的样式和模板技术.简单来说,如果我们需要简单的给一个Button设置宽,高,Marg ...
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选 ...
- hdu 4734 数位dp
给一个数A (十进制表示形式为AnAn-1An-2 ... A2A1,定义函数 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,给一个B, ...
- hdu 4055 递推
转自:http://blog.csdn.net/shiqi_614/article/details/7983298 题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果 ...
- long和int的区别
转自:http://blog.sina.com.cn/s/blog_6f62c9510101svjz.html 突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度. ...
- C# jsonhelper
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Sc ...
- 推荐一些顶级的Android开发书籍(转)
本帖对Android开发菜鸟和中级老兵同样适用,因为本帖重点列出了那些最常用的Android开发资源. 推荐书籍 你或许觉得,都现在了,再去看个什么书来学习Android开发,这方法应该早就过时了.没 ...
- PHP 一个表单多个提交按钮,处理不同的业务逻辑
<?phpini_set("error_reporting","E_ALL & ~E_NOTICE");?> <head>< ...