在实际编程中,一些数据的取值往往有限,只能是非常少量的整数。 另外,为了便于在后续代码中使用,最好对各值进行命名,例如一周只有7天、一年只有12个月、一个班每周有6个课程等。
以每周7天为例,可以使用#define命令每天指定名称。
1 #包含
2
3 #define Mon 1
4 #define Tues 2
5 #定义wed 3
6 #define Thurs 4
7 #define Fri 5
8 #define Sat 6
9 #define Sun 7
10
11 intmain () {12 intday; 13扫描(“% d”,日期); 14交换机(天) 15casemon:puts ) (Monday ); 布雷克; 16casetues:puts(Tuesday ); 布雷克; 17案例wed : puts (Wednesday ); 布雷克; 18casethurs:puts(Thursday ); 布雷克; 19casefri:puts(Friday ); 布雷克; 20casesat:puts(Saturday ); 布雷克; 21casesun:puts(Sunday ); 布雷克; 2default:puts('error!' ); 23 ) 24返回0; 25 }
执行结果:
5
弗雷迪
#define命令可以解决问题,但会带来不小的副作用,宏名称太多,代码松散,总觉得不舒服。 c语言提供枚举(Enum )类型,允许您列出和命名所有可能的值。
枚举类型的定义格式如下:
枚举类型名称{ value name 1,valueName2,valueName3,…};
enum是用于定义枚举类型的新关键字,这是c语言中的唯一目的。 typeName是枚举类型的名称; valueName1、valueName2、valueName3、是与每个值对应的名称列表。
注意最后一点; 不能少。
例如,列出一周有几天。
enum week{ Mon,Tues,Wed,Thurs,Fri,Sat,Sun };
您可以看到只给定了名称,而没有给定与名称对应的值。 这是因为枚举值默认从0开始,然后递增1。 也就是说,与week的Mon、tues……sun对应的值分别为0、1……6。
更简单的方法是只为第一个名称赋值。
enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun };
这样,枚举值从1开始递增,与上面的写法等价。
枚举是一种可以定义枚举变量的类型。
枚举week a、b、c;
也可以在枚举类型的同时定义变量。
enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun } a,b,c;
如果存在枚举变量,则可以分配列表中的值。
enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun }; enum week a=Mon,b=Wed,c=Sat;
enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun } a=Mon,b=Wed,c=Sat;
【例】判断用户输入了星期几。
#包含
intmain () enumweek ) mon=1,Tues,Wed,Thurs,Fri,Sat,sun ) day;
扫描(“% d”,日期); 交换机(天)情况通知: puts ) Monday ); 布雷克; casetues:puts(Tuesday ); 布雷克; 案例wed : puts (Wednesday ); 布雷克; casethurs:puts(Thursday ); 布雷克; casefri:puts(Friday ); 布雷克; casesat:puts(Saturday ); 布雷克; casesun:puts(Sunday ); 布雷克; 默认: puts (' error!' );
}返回0;
}
执行结果:
4
Thursday
需要注意的两点是:
1 )枚举列表中标识符为Mon、Tues和Wed的范围是全局(严格来说是main )函数内部),不能定义与它们同名的变量。
2 ) Mon、Tues、Wed等是常量,不能给它们赋值,只能给其他变量赋值。
枚举与宏非常类似。 宏在预处理阶段用相应的值替换名称,枚举在编译阶段用相应的值替换名称。 枚举可以理解为编译阶段的宏。
在上面的代码中,在编译的某个时刻,如下所示:
#包含
intmain () enumweek ) mon=1,Tues,Wed,Thurs,Fri,Sat,sun ) day;
扫描(“% d”,日期); 交换机(天)情况1: puts ) Monday ); 布雷克; case2:puts(Tuesday ); 布雷克; case3:puts(wednesday ); 布雷克; case4:puts(Thursday ); 布雷克; case5:puts(Friday ); 布雷克; case6:puts(Saturday ); 布雷克; case7:puts(Sunday ); 布雷克; 默认: puts (' error!' );
}返回0;
}
所有名称Mon、Tues和Wed都已被相应的数字替换。 也就是说,Mon、Tues、Wed等不是变量,不消耗数据区域(常数区域、全局数据区域、堆栈区域、堆区域)的内存,直接编译成命令并配置在代码区域中,所以使用获取它们的地址这就是枚举的本质。
枚举类型变量必须存储整数。 我认为需要和int一样长。 验证一下吧。
#包含
int main () )。
enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun } day=Mon;
printf(%d、%d、%d、%d、%d、%dn '、sizeof(enumweek )、sizeof (day )、sizeof (mon )、sizeof (wed ) )、sizeof
返回0;
}
执行结果:
4,4,4,4,4