C++之enum与switch

Explanation of switch_case

1. switch_case示例

#include "iostream"
using namespace std;

int main()
{
    
    
    int mark;
    cout<<"请输入成绩(0~100):";
    cin>>mark;

    switch (mark/20)
    {
    
    
        case 5:  //当输入mark/20等于5时
        {
    
    
            if(mark>100)//100~119都是mark/20==5,所以要用if语句再次进行过滤
            {
    
    
                cout<<"ERROR"<<endl;
                break;
            }
            cout<<"perfect"<<endl;//当mark=100时
            break;  
        }
        case 4:  //当mark输入80~99时
        {
    
    
            cout<<"Good!"<<endl;
            break;
        }
        case 3: //当mark输入60~79时
        {
    
    
            cout<<"Soso"<<endl;
            break;
        }
        case 2://当mark输入小于60时,由于case 2语句块中没有break,所以会继续跳转到下面其他语句块
        case 1:
        case 0://当mark小于60时,最终会进入case 0语句块
        {
    
    
            if (mark >=0)
            {
    
    
                cout<<"Please work harder!"<<endl; //所有大于等于0,小于60的成绩都会打印出“Please work harder!”
                break;
            }
            cout<<"ERROR!"<<endl;  //当mark小于0则显示出错!
        }
    }
    return 0;
}

2. 运行结果

在这里插入图片描述

Explanation of enum

1. 枚举量的声明和定义

enum enumType{
    
    Monday, TuesDay, Wednesday, Thursday, Friday, Saturday, Sunday}
//这句话有两个作用:
//1. 声明enumType为新的数据类型,称为枚举;
//2. 声明Monday,Tuesday等为符号常量,通常称之为枚举量,其默认值分别为0-6 。

enumType Weekday //声明enumType型的变量
//然而与基本变量类型不同的是,在不进行强制转换的前提下,只能将定义的枚举量赋值给该enumType型变量,如下:
Weekday = Monday;
Weekday = Sounday;  //不能将其他值赋给枚举变量,如:Weekday = 10; 这是不被允许的,因为10不是枚举量
//当然我们也可以利用强制类型转换,将其他类型值赋给枚举变量,我们下面会讲

//上面讲到不能将非枚举量赋给枚举变量,那么我们能不能将枚举量赋给非枚举变量呢?
int a = Sunday;   //这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换成int类型

//前面讲可以对枚举变量进行赋值运算,那枚举变量能不能进行算术运算呢?
Weekday++ ;                                         //非法
Weekday = Monday + Tuesday;    //这是非法的,因为这些操作可能导致违反类型限制
//比如:Weekday = Sunday; Weekday++; 首先枚举变量被赋值了枚举量中最后一个值Sunday(值为6),再进行递增的话,Weekday增加到了7,而对于enumType类型来说,7是无效的。
//总结来说:对于枚举,只定义了赋值运算,没有定义算术运算

//不能对枚举量进行算术运算,那么枚举量能不能参与其他类型变量的运算呢?
int a;
int a = 1 + Monday;  //这是允许的,因为编译器会自动将枚举量转换为int型

//我们如何通过强制转换将 非枚举量 赋值给 枚举变量 呢?
Weekday = enumType(2);//等同于Weekday=Wednesday;
                     //但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么后果呢?
Weekday = enumType(20); //结果将是不确定的,这么做不会出错,但是得不到想要的结果

2. 自定义枚举量的值

//前面讲通过定义 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}
//注意指定的值必须是整数

//当然也可以显式的定义一部分枚举量的值
enum enumType {
    
    Monday=1, Tuesday, Wednesday=1,Thursday,Friday,Saturday,Sunday};
//这样Monday、Wednesday均被定义为1,则Tuesday=2,Thursday,Wednesday,Friday,Saturday,Sunday的值分别默认为2、3、4、5
//总结:未被初始化的枚举值的默认值将比其他前面的枚举值大1
//同时,我们也可以看出枚举量的值可以是相同的

3. 枚举的取值范围

前面讲到可以通过强制转换将其他类型值赋给枚举变量:Weekday=enumType(2); 这是合法的;但是Weekday=enumType(20);这是非法的。

这里涉及枚举取值范围的概念:枚举的上限是 大于最大枚举量的 最小的2的幂 减去1(例如最大枚举量的值为5,大于最大枚举量且为2的幂:8,减去1,为7,所以枚举取值的上限为7);

枚举的下限有两种情况:一、枚举量的最小值不小于0,则下限取值为0;二、枚举量的最小值取值小于0,则枚举的下限是 小于最小枚举量的 最大的2的幂 加上1

举例来讲:

enum enumType1{
    
    First=-5, Second=14, Third=10};
//则枚举的上限是16-1=15,枚举的下限是-8+1=-7

4. 枚举的应用:enum与switch结合使用

个人觉得枚举switch是最好的搭档,如下所示:

//枚举和switch是最好的搭档:
#include <iostream>

using namespace std;
enum enumType{
    
    Step0, Step1, Step2, Step3, Done};

int main()
{
    
    
    enumType Step;
    Step = Step0;
    do
    {
    
    
        switch (Step)
        {
    
    
            case Step0: 
            {
    
    
                //语句块;
                Step = Step1; 
                cout<<"Step0"<<endl;
                break;
            }
            case Step1:
            {
    
    
                //语句块;
                Step = Step2;
                cout<<"Step1"<<endl;
                break;
            }
            case Step2:
            {
    
    
                //语句块;
                Step = Step3;
                cout<<"Step2"<<endl;
                break;
            }
            case Step3:
            {
    
    
                //语句块
                Step = Done;
                cout<<"Step3"<<endl;
                break;
            }
            default:{
    
    }
        }
    
    } while (Step != Done);

    return 0;

}

5. 运行结果

依次打印出Step0,Step1,Step2,Step3:
在这里插入图片描述

6. 参考博客

https://blog.csdn.net/bruce_0712/article/details/54984371

猜你喜欢

转载自blog.csdn.net/weixin_46181372/article/details/111773503