精华内容
下载资源
问答
  • 关于C++枚举枚举

    2020-05-23 14:48:44
    众所周知,C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建...(一)枚举的声明和定义 (1)首先,请看下面的语句: enum enumType { Monday, Tuesday, Wednesday, Thursday, Friday, Sa

    转载地址:https://blog.csdn.net/bruce_0712/article/details/54984371

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

    (一)枚举量的声明和定义

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

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

    这句话有两个作用:

    1. 声明enumType为新的数据类型,称为枚举(enumeration);
    2. 声明Monday、Tuesday等为符号常量,通常称之为枚举量,其值默认分别为0-6。(后面会介绍怎样显式的初始化枚举量的值)

    (2)接着利用新的枚举类型enumType声明这种类型的变量enumType Weekday,可以在定义枚举类型时定义枚举变量:
    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,并初始化为Step0

    switch (Step)

    {

    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 calss Enum:unsigned int{VAL1,VAL2};
    

    正如前面所说,强类型枚举能解决传统枚举不同枚举类下同枚举值名的问题,使用枚举类型的枚举名时,必须指明所属范围,比如:Enum::VAL1,而单独的VAL1则不再具有意义。
    还有一点值得说明的是C++11中枚举类型的前置声明也是可行的,比如:

    enum calss 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(Color*p);        //前置声明的使用
    //....................
    enum class Color:char{RED,GREEN,BLACK,WHITE};                       //前置声明的定义
    
    展开全文
  • JDK1.5枚举使用

    2012-05-31 08:42:38
    一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举构造函数必须为私有(这点不难理解)。 枚举类也可以实现接口、或继承抽象类。 JDK5中扩展了swith语句,它除了可以接收int, byte, char, ...
    知识点


    枚举类具有如下特性:
    枚举类也是一种特殊形式的Java类。
    枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
    与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。
    枚举类也可以实现接口、或继承抽象类。
    JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。
    若枚举类只有一个枚举值,则可以当作单态设计模式使用。
    练习:请编写一个关于星期几的枚举WeekDay,要求:
    枚举值:Mon、Tue 、Wed 、Thu 、Fri 、Sat 、Sun
    该枚举要有一个方法,调用该方法返回中文格式的星期。
    Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:
    name()
    ordinal()//返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
    valueof(Class enumClass, String name) //返回带指定名称的指定枚举类型的枚举常量。
    //String str=”B”;Grade g=Grade.valueOf(Grade.class,str);
    values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。





    //如何定义枚举的构造函数、方法、字段
    public class Demo1 {
    @Test
    public void test() {
    print(Grade.B);
    }

    public void print(Grade g) // A B C D E
    {
    String value=g.getValue();
    System.out.println(value);
    }
    }

    /*
    * class Grade{ private Grade(){ }
    * public static final Grade A=new Grade();
    * public static final Grade B=new Grade();
    * public static final Grade C=new Grade();
    * public static final Grade D=new Grade();
    * public static final Grade E=new Grade();
    * }
    */

    enum Grade {
    // class A 100-90 B 89-80 C 79-70 D 69-60 E 59-0
    同上面的注释代码 这里是带参数的构造函数,以下就是在实例化对象
    A("100-90"), B("89-80"), C("79-70"), D("69-60"), E("59-0");// object
    private String value;
    //构造函数是私有的
    private Grade(String value){
    this.value=value;
    }
    public String getValue(){
    return this.value;
    }
    }


    //带抽象方法的枚举

    public class Demo1 {
    @Test
    public void test() {
    print(Grade.B); //89-80,良
    }

    public void print(Grade g) // A B C D E
    {
    String value=g.getValue();
    String value2=g.localeValue();

    System.out.println(value+","+value2);
    }
    }

    enum Grade {// class A 100-90优 B 89-80良 C 79-70 一般D 69-60差 E 59-0不及格
    //因为在实例化这个对象的时候这个类有抽象方法则必须进行实现
    A("100-90"){
    public String localeValue(){
    return "优";
    }
    },
    B("89-80"){
    public String localeValue(){
    return "良";
    }
    },
    C("79-70"){
    public String localeValue(){
    return "一般";
    }
    },
    D("69-60"){
    public String localeValue(){
    return "差";
    }
    },
    E("59-0"){
    public String localeValue(){
    return "不及格";
    }
    };// object

    private String value;
    private Grade(String value){
    this.value=value;
    }
    public String getValue(){
    return this.value;
    }
    //声明抽象方法
    public abstract String localeValue();
    }
    展开全文
  • 关于C ++语言全部内容(编码) 这个仓库包含了所有必不可少东西,包括编码以及README文件中理论...每个人都应该知道。 C ++是一种可用于创建高性能应用程序跨平台语言。 C ++由Bjarne Stroustrup开发,是对...
  • 6.2 声明语句 6.3 复合语句(块) 6.4 语句作用域 6.5 if语句 6.6 switch语句 6.6.1 使用switch 6.6.2 switch中控制流 6.6.3 default标号 6.6.4 switch表达式与case标号 6.6.5 switch内部变量定义 6.7...
  • 6.2 声明语句 6.3 复合语句(块) 6.4 语句作用域 6.5 if语句 6.6 switch语句 6.6.1 使用switch 6.6.2 switch中控制流 6.6.3 default标号 6.6.4 switch表达式与case标号 6.6.5 switch内部变量定义 6.7...
  • C语言科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    9.1 枚举的原理 234 9.1.1 在机器内部表示枚举类型 234 9.1.2 将枚举类型表示为整数 235 9.1.3 定义新的枚举类型 235 9.1.4 枚举类型的操作 237 9.1.5 标量类型 238 9.2 字符 238 9.2.1 数据类型char 238 ...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char*p;*p=malloc(10); 声明风格 1.7 怎样声明和定义全局变量...
  • 这样,因为w 是在if 语句里定义,所以当if 语句执行完后它就无效了。这样 导致后果就是,按下enterBtn 后,主界面窗口一闪就没了。如果此时对程序 改动了,再次点击运行时,就会出现error: collect2: ld ...
  • 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char*p;*p=malloc(10);  声明风格  1.7 怎样声明和定义全局变量...
  • 6.3.3 声明语句 6.3.4 赋值语句 6.4 高手点拨 6.5 实战练习 第7章 程序执行方向——程序控制结构 7.1 程序逻辑 7.1.1 顺序结构 7.1.2 分支结构 7.1.3 循环结构 7.2 选择结构 7.2.1 if语句 ...
  • 1.36 我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢? 1.37 能够初始化联合吗? 第2章 结构、联合和枚举 结构声明 2.1 struct x1{ };和typedef struct{ }x2; 有什么不同? 2.2 这样的代码为什么不对?...
  •  复杂的声明 1.21 怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 1.22 如何声明返回指向同类型函数的指针的函数?我在设计一个状态机,用函数表示每种状态,每...
  •  1.36 我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢?  1.37 能够初始化联合吗? 第2章 结构、联合和枚举  结构声明  2.1 struct x1{ };和typedef struct{ }x2; 有什么不同?  2.2 这样的代码为什么...
  • 1.36 我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢? 1.37 能够初始化联合吗? 第2章 结构、联合和枚举 结构声明 2.1 struct x1{ };和typedef struct{ }x2; 有什么不同? 2.2 这样的代码为什么不对?...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.36 我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢? 20 1.37 能够初始化联合吗? 20 第2章 结构、联合和枚举 21 结构声明 21 2.1 struct x1{ };和typedef struct{ }x2; 有什么不同? 21 2.2...
  • 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char *p; *p=malloc(10); 4 声明风格 4 1.7 怎样声明和...
  • 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char *p; *p=malloc(10); 33 声明风格 33 1.7 怎样声明和...
  • 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char *p; *p=malloc(10); 33 声明风格 33 1.7 怎样声明和...
  • javascript文档

    2009-08-11 10:44:24
    function 语句 声明一个新函数。 getDate 方法 使用当地时间返回 Date 对象月份日期值。 getDay 方法 使用当地时间返回 Date 对象星期几。 getFullYear 方法 使用当地时间返回 Date 对象年份。 getHours...
  • JScript 语言参考

    2009-05-28 08:53:39
    function 语句 声明一个新函数。 getDate 方法 使用当地时间返回 Date 对象月份日期值。 getDay 方法 使用当地时间返回 Date 对象星期几。 getFullYear 方法 使用当地时间返回 Date 对象年份。 getHours...
  • 微软JavaScript手册

    2009-04-08 22:54:53
    function 语句 声明一个新函数。 getDate 方法 使用当地时间返回 Date 对象月份日期值。 getDay 方法 使用当地时间返回 Date 对象星期几。 getFullYear 方法 使用当地时间返回 Date 对象年份。 getHours...
  • 微软C#编码规范.doc

    2020-08-22 10:16:32
    微软内部员工写的.net编码规范 本文档描述了微软一站式代码示例库项目组所采纳的关于...2.5 变量的声明和初始化 6 2.6 函数的声明和调用 7 2.7 语句 8 2.8 枚举 9 2.9 空格 14 2.10 大括号 15 2.11 注释 17 2.12 代码块
  • 对象声明描述是存 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...
  • 2021-01-16

    2021-01-16 19:10:16
    C语言关键字共有32个,根据关键字作用,可分bai其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。 一、关于数据类型关键字(12个) char :声明字符型变量或函数 double :声明双精度变量...

    标题C语言关键字

    C语言的关键字共有32个,根据关键字的作用,可分bai其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。

    一、关于数据类型的关键字(12个)

    char :声明字符型变量或函数

    double :声明双精度变量或函数

    enum :声明枚举类型 (enum类型可以增加可读性,可移植性;在enum中定义的每个对象,默认都是从0开始,当然也可以自定义。)

    float:声明浮点型变量或函数

    int:声明整型变量或函数

    long :声明长整型变量或函数

    short :声明短整型变量或函数

    signed:声明有符号类型变量或函数

    struct:声明结构体变量或函数

    union:声明共用体(联合)数据类型 (如果不使用union,需要分别定义int、float、cahr,需要占用12字节的内存空间,当使用union时,只需要占用4字节即可。)

    unsigned:声明无符号类型变量或函数

    void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

    二、关于控制语句的关键字

    1、循环语句

    for:一种循环语句(可意会不可言传)

    do :循环语句的循环体

    while :循环语句的循环条件

    break:跳出当前循环

    continue:结束当前循环,开始下一轮循环

    2、条件语句

    if: 条件语句

    else :条件语句否定分支(与 if 连用)

    goto:无条件跳转语句

    3、开关语句

    switch :用于开关语句

    case:开关语句分支

    default:开关语句中的“其他”分支

    4、返回语句

    return :子程序返回语句(可以带参数,也看不带参数)

    三、关于存储类型的关键字

    auto :声明自动变量 一般不使用

    extern:声明变量是在其他文件正声明(也可以看做是引用变量)## 标题

    register:声明积存器变量

    static :声明静态变量

    展开全文
  • 6.2 声明语句 6.3 复合语句(块) 6.4 语句作用域 6.5 if语句 6.6 switch语句 6.7 while语句 6.8 for循环语句 6.9 do while语句 6.10 break语句 6.11 continue语句 6.12 goto语句 6.13 try块和异常处理 6.14 使用预...
  • 对象声明描述是存 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...
  • 对象声明描述是存 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 160
精华内容 64
关键字:

关于枚举的声明语句