枚举

复制代码
复制代码
 1 *#include<stdio.h>
 2 #define Mon 1
 3 #define Tue 2
 4 #define Wed 3
 5 #define Thu 4
 6 #define Fri 5
 7 #define Sat 6
 8 #define Sun 7
 9 int main()
10 {
11     int n;
12     scanf("%d",&n);
13     switch(n){
14         case Mon: puts("Monday"); break;
15         case Tue: puts("Tuesday"); break;
16         case Wed: puts("Wednesday"); break;
17         case Thu: puts("Thursday"); break;
18         case Fri: puts("Friday"); break;
19         case Sat: puts("Saturday"); break;
20         case Sun: puts("Sunday"); break;
21         default: puts("Error!"); 
22     }
23     return 0;
24 }
复制代码
复制代码
 1 #include<stdio.h>
 2 
 3 enum week{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};
 4 int main()
 5 {
 6     enum week n;
 7     scanf("%d",&n);
 8     switch(n){
 9         case Mon: puts("Monday"); break;
10         case Tue: puts("Tuesday"); break;
11         case Wed: puts("Wednesday"); break;
12         case Thu: puts("Thursday"); break;
13         case Fri: puts("Friday"); break;
14         case Sat: puts("Saturday"); break;
15         case Sun: puts("Sunday"); break;
16         default: puts("Error!"); 
17     }
18     return 0;
19 }
复制代码

 

复制代码

注意

1) 枚举列表中的 Mon、Tue、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。

2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

 

对于上面的代码,在编译的某个时刻会变成类似下面的样子:

复制代码
 1 #include<stdio.h>
 2 
 3 enum week{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};
 4 int main()
 5 {
 6     enum week n;
 7     scanf("%d",&n);
 8     switch(n){
 9         case 1: puts("Monday"); break;
10             case 2: puts("Tuesday"); break;
11             case 3: puts("Wednesday"); break;
12             case 4: puts("Thursday"); break;
13             case 5: puts("Friday"); break;
14             case 6: puts("Saturday"); break;
15             case 7: puts("Sunday"); break;
16             default: puts("Error!"); 
17     }
18     return 0;
19 }        
复制代码

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tue、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

posted @   泥烟  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示