枚举

 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 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

上一篇:ceph-add monitor


下一篇:[斯坦福大学2014机器学习教程笔记]第五章-基本操作