首页 » Web前端 » php列举int技巧_C 之 enum 列举量声明定义运用与强类型列举详解

php列举int技巧_C 之 enum 列举量声明定义运用与强类型列举详解

访客 2024-12-11 0

扫一扫用手机浏览

文章目录 [+]

众所周知,C/C++ 措辞可以利用 #define 和 const 创建符号常量,而利用 enum 工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下 enum 的利用方法。

步骤(一)——列举量的声明和定义

php列举int技巧_C 之 enum 列举量声明定义运用与强类型列举详解

(1) 首先,请看下面的语句:

php列举int技巧_C 之 enum 列举量声明定义运用与强类型列举详解
(图片来自网络侵删)

enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

这句话有两个浸染:

第一:声明 enumType 为新的数据类型,称为列举(enumeration);第二:声明 Monday、Tuesday 等为符号常量,常日称之为列举量,其值默认分别为 0-6。
(后面会先容若何显式的初始化列举量的值)

(2) 接着利用新的列举类型 enumType 声明这种类型的变量:enumType Weekday 就像利用基本变量类型int声明变量一样,如 int a; 也可以在定义列举类型时定义列举变量

enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;

然而与基本变量类型不同的地方是,在不进行逼迫转换的条件下,只能将定义的列举量赋值给该种列举的变量,如: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);

结果将是不愿定的,这么做不会出错,但得不到想要的结果。

步骤(二)——自定义列举量的值

(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) 第二条还解释其余一个征象,便是列举量的值可以相同。

步骤(三)——列举的取值范围

前面讲到可以通过逼迫转换将其他类型值赋给列举变量:

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的幂);

步骤(四)——列举运用

个人以为列举和 switch 是最好的差错:

enum enumType{Step0, Step1, Step2}Step=Step0; // 把稳这里在声明列举的时候直接定义了列举变量 Step,并初始化为 Step0switch (Step)x{ case Step0:{...;break;} case Step1:{...;break;} case Step2:{...;break;} default:break;}

其余列举还有一种少见的用法是 enum { one ,two ,three}; 便是不指定一个名字,这样我们自然也没法去定义一些列举类型了。
此时就相称于 static const int one = 0; 这样定义三个常量一样。
然后用的话便是 int no = one。

强类型列举

一、简述

强类型列举(Strongly-typed enums),号称列举类型,是C++11中的新语法,用以办理传统C++列举类型存在的毛病。
传统C++中列举常量被暴漏在外层浸染域中,这样若是同一浸染域下有两个不同的列举类型,但含有相同的列举常量也是不可的,比如:

enum Side{Right,Left};enum Thing{Wrong,Right};

这是不能一起用的。

其余一个毛病是传统列举值总是被隐式转换为整形,用户无法自定义类型。
C++11中的强类型列举办理了这些问题。

二、强类型列举

强类型列举利用enum class语法来声明,如下:

enum class Enumeration{ VAL1, VAL2, VAL3=100, VAL4};

这样,列举类型时安全的,列举值也不会被隐式转换为整数,无法和整数数值比较,比如(Enumeration::VAL4==10会触发编译缺点)。

其余列举类型所利用的类型默认为int类型,也可指定其他类型,比如:

enum class Enum:unsigned int{VAL1,VAL2};

正如前面所说,强类型列举能办理传统列举不同列举类下同列举值名的问题,利用列举类型的列举名时,必须指明所属范围,比如:Enum::VAL1,而单独的VAL1则不再具故意义。

还有一点值得解释的是C++11中列举类型的前置声明也是可行的,比如:

enum class Enum;enum class Enum1:unsigned int;

三、项目中的强类型列举代码片段

1、图像处理

enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};

2.交通灯

enum class TrafficLight{RED,YELLOR,GREEN};

强类型列举值具有传统列举的功能——命名列举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。
以是也称之为列举类——enmu class

列举类的底层数据必须是有符号或无符号整型,比如 char unsigned int unsigned long,默认为 int。

3.前置声明运用

enmu class Clolor:char; //前置声明列举类void Foo(Colorp); //前置声明的利用//....................enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置声明的定义

标签:

相关文章

initphp技巧_PHP第十节课操作数据库2

学会利用PHP编写数据库连接的公用功能,并操作数据库链接,实现数据的查询、增加和删除功能。PHP逻辑代码和html代码分离。2、...

Web前端 2024-12-13 阅读0 评论0