#include <iostream>
int main()
{
using namespace std;
enum spectrum {red, orange, yellow, green, blue, violent, indigo, ultraviolent};
//enum是创建符号常量的方式,这种方式可以替代const,
//此处spectrum是新类型的名称,spectrum被称为枚举,就想struct变量称为结构一样
//将red、orange等作为符号常量,它们对应整数值0~7,这些常量叫做枚举常量。
//如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称,如下
enum {dhidh ,sjqidhq ,shidh1 ,dhw9h };
//将默认情况下,将整数值赋给枚举量(但并非枚举类型就是整型,只是每个每个枚举量都对应一个整数值),第一个枚举量的值为0,第二个枚举量的值为1,
spectrum band;
band = blue;//在不进行强制类型转化的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。
//band = 2000;//error
//++band;//error ,对于枚举,只定义了赋值运算符,具体而言,没有为枚举定义算术运算符
//band = organe + red;//error ,ditto
int color = blue;
//band = 3;//error 枚举量是整型,可以被提升成整型,但是int类型不能自动转化成枚举类型,3是整型,不能自动转化成枚举类型;
color = 3 + red;//red是枚举量,对应的枚举量是0,枚举类型可以被提升为整型量。
//这种情况下,枚举将被转化成int类型,因此可以在算术表达式中同时使用枚举和常规整数,尽管没有为枚举本身定义算术运算。
//band = orange + red;//error ,原因是,确实没有为枚举定义运算符+,但是用于算术表达式中时,枚举将被转化成整数
//orange+red被转化成1+0,但其类型是int类型,不能将其赋值给spectrum的变量band。
band = spectrum(3);//如果int值有效,可以通过强制类型转化,将它赋给枚举变量
//总结就是,枚举的规则十分严格,枚举更常被用来定义相关的符号常量,而不是新类型。
///设置枚举量的值
enum bits{one = 1,two = 2,four = 4, eight = 8};//可以使用赋值运算符来显示地设置枚举量的值
enum bigtep{first , second = 100, third};//也可以显式地定义其中一些枚举量的值
//此时first在默认情况下为0,后面没有被初始化的枚举量将比其起前面的枚举量大1,因此,third的枚举量是101;
enum {zero, null = 0, one, numero_uno = 1};
//其中zero和null都为0,numero_uno和one都是1,
//枚举的取值范围
//可以将取值范围中任何变量都赋给枚举变量,即使这个值不是枚举量。
//取值范围的计算方式:
//1、找出上限,找到大于这个上限的最大值的2的幂,将它减去1,,例如上面的bigtep上限就是128-1=127,
//如果最小值不小于0,那么取值范围的下限就是0,最小值小于0,采取与上限相同的方式,再加上负号,例如最小是-6,那么下限就是-7
//(比6大的2的最小幂是8,8-1=7,加上负号就是-7)
return 0;
}