C语言:枚举类型

devtools/2025/1/11 23:54:36/

一、枚举类型的声明

枚举顾名思义就是一一列举。我们可以把可能的取值一一列举。比如我们现实生活中: 星期一到星期日是有限的7天,可以一一列举 ;性别有:男、女、保密,也可以一一列举 ;月份有12个月,也可以一一列举 。 这些数据的表示就可以使用枚举了。
enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex//性别
{MALE,FEMALE,SECRET
};
enum Color//颜⾊
{RED,GREEN,BLUE
};

以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量 。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

#include <stdio.h>
enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
int main()
{printf("%d\n", Mon);printf("%d\n", Tues);printf("%d\n", Wed);printf("%d\n", Thur);printf("%d\n", Fri);printf("%d\n", Sat);printf("%d\n", Sun);return 0;
}

上面展示的就是枚举常量默认的取值,从0开始,然后不断往后加1。

#include <stdio.h>
enum Color//颜色
{RED = 2,GREEN = 4,BLUE = 8
};
int main()
{printf("%d\n", RED);printf("%d\n", GREEN);printf("%d\n", BLUE);return 0;
}

我们也可以在声明中通过直接初始化枚举常量。当然还有一种情况,我们可以和只初始化其中几个枚举常量,后面的枚举常量都会根据其前面的值加1递推。

#include <stdio.h>
enum Color//颜色
{RED = 2,GREEN = 4,BLUE
};
int main()
{printf("%d\n", RED);printf("%d\n", GREEN);printf("%d\n", BLUE);return 0;
}

二、枚举类型的优点

我们使用  #define 就可以 定义常量,为什么非要使用枚举?
其实枚举又有以下几个优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨
3.便于调试,预处理阶段会删除 #define 定义的符号
4.使用方便,一次可以定义多个常量
5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
三、枚举类型的使用
#include <stdio.h>
enum Color//颜色
{RED = 1,GREEN = 2,BLUE = 4
};
int main()
{enum Color clr = GREEN;//使用枚举常量给枚举变量赋值return 0;
}
枚举类型是一种自定义类型,它的定义和其他类型的变量类似,在上图的代码中clr就是创建出的一个枚举变量。如图,我们可以将枚举常量赋值给枚举变量。那我们是否可以拿整数直接给枚举变量赋值呢?这个做法在C语言中是可以的,但是在C++是不行的,因为C++的类型检查会比较严格。说了这么多,其实还是没能看出枚举的作用,在下面进行一个演示:我们之前在实现简易计算器的时候会这样来实现,那我们能不能使用枚举来对其进行优化呢?
#include<stdio.h>
void menu()
{printf("***0.exit***\n");printf("***1.add****\n");printf("***2.sub****\n");printf("***3.mul****\n");printf("***4.div****\n");printf("请输入...\n");
}
int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int div(int x, int y)
{return x / y;
}
void is(int(*p)(int, int))
{int a, b;printf("请输入两个操作数...\n");scanf("%d%d", &a, &b);printf("结果是:%d\n", p(a, b));
}
int main()
{int n;int(*p[5])(int, int) = { 0,add,sub,mul,div };while (1){menu();scanf("%d", &n);if (n > 0 && n < 5){switch (n){case 1:{is(add);break;}case 2:{is(sub);break;}case 3:{is(mul);break;}case 4:{is(div);break;}}}else if (n == 0){printf("退出计算器\n");break;}elseprintf("输入有误\n");}return 0;
}

进行如下的改造我们就可以在选择语句选择函数时清楚地知道调用的是什么函数,这样就增加了代码的可读性。

#include<stdio.h>
void menu()
{printf("***0.exit***\n");printf("***1.add****\n");printf("***2.sub****\n");printf("***3.mul****\n");printf("***4.div****\n");printf("请输入...\n");
}
enum CAS
{EXIT,ADD,SUB,MUL,DIV
};
int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int div(int x, int y)
{return x / y;
}
void is(int(*p)(int, int))
{int a, b;printf("请输入两个操作数...\n");scanf("%d%d", &a, &b);printf("结果是:%d\n", p(a, b));
}
int main()
{int n;int(*p[5])(int, int) = { 0,add,sub,mul,div };while (1){menu();scanf("%d", &n);if (n > 0 && n < 5){switch (n){case ADD:{is(add);break;}case SUB:{is(sub);break;}case MUL:{is(mul);break;}case DIV:{is(div);break;}}}else if (n == EXIT){printf("退出计算器\n");break;}elseprintf("输入有误\n");}return 0;
}

http://www.ppmy.cn/devtools/149726.html

相关文章

Elixir语言的语法糖

Elixir语言的语法糖 引言 Elixir语言作为一种功能强大且灵活的编程语言&#xff0c;近年来在开源社区中产生了不小的影响。它被广泛应用于构建高并发、高可用性的应用程序&#xff0c;特别是在分布式系统和实时应用方面。不过&#xff0c;Elixir之所以受欢迎&#xff0c;除了…

远程和本地文件的互相同步

文章目录 1、rsync实现类似git push pull功能1. 基础概念2. 示例操作3. 定制化和进阶用法4. 定时同步&#xff08;类似自动化&#xff09; 2 命令简化1. 动态传参的脚本2. Shell 函数支持动态路径3. 结合环境变量和参数&#xff08;更简洁&#xff09;4. Makefile 支持动态路径…

Halcon在linux及ARM上的安装及c++工程化

一、HALCON下载 建议到HALCON官方下载页选择linux版本下载,压缩包名为MVTec_HALCON_Progress-18.11.0.1-linux(x64-aarch64-armv7a)-FullVersion.tar.gz。下载前需要登录HALCON帐号,如果没有请自行注册,填写一些基本信息然后激活邮件,操作方便简易。 下载许可证文件 该许…

python-leetcode-三数之和

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort() # 排序n len(nums)res []for i in range(n):# 剪枝&#xff1a;如果当前数 > 0&#xff0c;三数之和不可能为 0if nums[i]…

C#异常处理精髓:throw机制深度剖析

在C#编程中&#xff0c;异常处理是确保程序稳健性和可靠性的关键环节。其中&#xff0c;throw语句扮演着至关重要的角色&#xff0c;它用于显式地抛出异常&#xff0c;使程序能够在遇到错误条件时采取适当的措施。本文将深入探讨C#中的throw机制&#xff0c;通过实际示例和详细…

javascript-闭包

REF:https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

C++—14、C++ 中的指针最基础的原理

这里的指针是指原始指针&#xff0c;并非智能指针。计算机跟内存打交道&#xff0c;内存是计算机的一切&#xff0c;编程中最重要的东西可能就是内存。当你编写一个应用程序并启动它时&#xff0c;整个程序被载入内存&#xff0c;在你写的代码中&#xff0c;所有指令告诉计算机…

在 Ubuntu 上安装和配置 Redis

在 Ubuntu 上安装和配置 Redis&#xff0c;并使用发布-订阅&#xff08;Pub/Sub&#xff09;功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、安装 Redis 1. 更新包列表 首先&#xff0c;更新本地的包列表以确保获取到最新的软件包信息&#xff1a; sudo apt update…