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