C++学习9:枚举enum
2017-08-12 23:13
309 查看
enum是一种创建符号常量的方式,可用于替代const。
例如:
color是枚举名,是一种新类型,red、orange、yellow等是枚举量,都是符号常量,对应0~7的整数。
可以使用赋值运算符来设置枚举量的值,枚举量可以相等,左侧不一定大于右侧。而没有被设置的枚举量等于前一个枚举量+1。
例如:
结果为
在c++早期版本中,只能将int值赋给枚举量,但后来取消了该限制,可以使用long、long long类型的值赋值。
例如:
color c为枚举变量,其取值为枚举量中的一个。
枚举变量不是int型,不能直接赋int值,可以使用枚举量赋值。
例如:
这里单独说下第三种情况,如果强制类型转换的int值不在枚举范围内,结果是不确定的,这样做不会出错,但不能依赖得到的结果。下面的第三部分会说明枚举的取值范围。
枚举变量可以直接相互赋值。
例如:
每个枚举都有其取值范围,在取值范围内的任意整数,无论是不是枚举量,都可以赋给枚举变量。
例如:
由第一部分我们知道,枚举量中不包含13,而13实际是在取值范围内的,因此赋值是正确的。下面来看如何确定取值范围。
取值范围由枚举上下限确定,上限为大于最大枚举量的最小2的幂减1,下限分两种情况:如果枚举量都不小于0,则下限为0,否则同上限,不过要加个负号。
例如一个枚举的最大枚举量为98,最小枚举量为-5,则其上限为128-1=127,下限为-(8-1)=-7。
这个取值范围是在正确使用时才会保证有效的,下面来看一个特殊例子:
结果如下:
根据刚才的理论,color最大枚举量为12,,取值范围应该为[0,15]。120已经超出了范围,却没有报错。在CSDN论坛里有很不错的解释:http://bbs.csdn.net/topics/390808288
原因在于,这里使用了强制类型转换,破坏了检测机制。编译器是不对强制转换带来的错误进行评估的,因此没有报错。因此这种错误只能由程序员自己负责。
2、enum只能指定整型常量,而const可以指定任意类型常量。比如const double PI = 3.14159。
3、试图修改const定义的变量时,编译器会报错。而枚举变量的值是可以修改的。
1. 定义:
默认情况下,enum定义的枚举量会成为符号常量,对应从0开始的整数,从左到右依次+1。例如:
enum color{red, orange, yellow, green, blue, violet, black};
color是枚举名,是一种新类型,red、orange、yellow等是枚举量,都是符号常量,对应0~7的整数。
可以使用赋值运算符来设置枚举量的值,枚举量可以相等,左侧不一定大于右侧。而没有被设置的枚举量等于前一个枚举量+1。
例如:
enum color{red = 1, orange, yellow=1 , green, blue, violet= 11, black}; cout<< red <<endl << orange <<endl << yellow <<endl << green <<endl << blue <<endl << violet <<endl << black <<endl; system("pause");
结果为
1 2 1 2 3 11 12 请按任意键继续. . .
在c++早期版本中,只能将int值赋给枚举量,但后来取消了该限制,可以使用long、long long类型的值赋值。
2、枚举变量:
枚举名+变量名,定义枚举变量。例如:
color c;
color c为枚举变量,其取值为枚举量中的一个。
枚举变量不是int型,不能直接赋int值,可以使用枚举量赋值。
例如:
c = 3; //错误,不可以使用int赋值。 c = red; //正确 c = color(13); //正确,color(3)对int值进行了强制类型转换。 c = red + green; //错误,red和green相加会转换位int值。
这里单独说下第三种情况,如果强制类型转换的int值不在枚举范围内,结果是不确定的,这样做不会出错,但不能依赖得到的结果。下面的第三部分会说明枚举的取值范围。
枚举变量可以直接相互赋值。
例如:
color a; color c; c = a;
3、取值范围:
按照定义来说,枚举应该是在声明中具有的那些值才有效,但c++通过强制类型转换增加了其取值范围。每个枚举都有其取值范围,在取值范围内的任意整数,无论是不是枚举量,都可以赋给枚举变量。
例如:
enum color{red = 1, orange, yellow=1 , green, blue, violet= 11, black}; color c; c = color(13);
由第一部分我们知道,枚举量中不包含13,而13实际是在取值范围内的,因此赋值是正确的。下面来看如何确定取值范围。
取值范围由枚举上下限确定,上限为大于最大枚举量的最小2的幂减1,下限分两种情况:如果枚举量都不小于0,则下限为0,否则同上限,不过要加个负号。
例如一个枚举的最大枚举量为98,最小枚举量为-5,则其上限为128-1=127,下限为-(8-1)=-7。
这个取值范围是在正确使用时才会保证有效的,下面来看一个特殊例子:
enum color{red = 1, orange, yellow=1 , green, blue, violet= 11, black}; color a; a = color(120); cout<< a <<endl;
结果如下:
120 请按任意键继续. . .
根据刚才的理论,color最大枚举量为12,,取值范围应该为[0,15]。120已经超出了范围,却没有报错。在CSDN论坛里有很不错的解释:http://bbs.csdn.net/topics/390808288
原因在于,这里使用了强制类型转换,破坏了检测机制。编译器是不对强制转换带来的错误进行评估的,因此没有报错。因此这种错误只能由程序员自己负责。
4、与const的区别:
1、enum可以定义新类型,而const是修饰符,无法定义新类型。比如上面的color a。2、enum只能指定整型常量,而const可以指定任意类型常量。比如const double PI = 3.14159。
3、试图修改const定义的变量时,编译器会报错。而枚举变量的值是可以修改的。
相关文章推荐
- 【C/C++】枚举enum学习小记
- 【转】【C/C++】枚举enum学习小记
- C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装
- C++和Java中枚举enum的用法
- 【转】C++中enum枚举类型成员重名问题的解决方法 - Enum枚举类型的类封装
- c++ 枚举(enum)的用法
- Java学习笔记82. 枚举 enum
- 【C++】enum枚举类型
- C++-枚举enum
- 黑马程序员_学习笔记:11) Jdk5.0新特性:增强for循环、可变参数(...)、静态导入、枚举:关键字 enum、自动拆装箱、泛型
- Java初学习 - enum(枚举)的一点说明
- 【转】枚举enum学习小记
- Java 枚举(enum)入门学习
- c++之enum(枚举) 仅仅代码
- c++强类型枚举enum class NEWTYPE
- C++基础教程(三)——枚举enum
- C++学习笔记(三)enum
- 【C++学习与应用总结】12: Unscoped Enum
- C++基础教程(三)——枚举enum
- 从Android/Java基础之上学习C/C++语言(6)--C语言基础--联合体与枚举