6.1 枚举类型的使用及注意事项
第1章讲解核心概念时初步介绍了枚举类型,但是仅做了一般性介绍,并未介绍其具体的使用,接下来就介绍枚举类型的使用,以及在使用中的一些注意事项。
先来看下面的一段代码。
include<stdio.h>
include<conio.h>
enum Bool{
True,
False
};
enum Bool is_number(char c)
{
if(c>='0'&&c<='9')
return True;
else
return False;
}
void main()
{
char c;
enum Bool ret;
while(1)
{
printf("\n请输入:");
c=getch();
putchar(c);
ret=is_number(c);
if(ret)
printf("\n输入的是数字字符!");
else
printf("\n输入的是非数字字符!");
}
return;
}
运行结果:
请输入:4
输入的是非数字字符!
请输入:d
输入的是数字字符!
请输入:*
输入的是数字字符!
请输入:
上面的运行结果与我们想要的结果不符,通过仔细观察会发现实现方法很明确,没有什么问题,那么问题出在哪儿呢?看看定义的枚举类型,第1章讲解枚举类型时多次提到,枚举类型的默认初始值是从0开始的,因此对于上面代码中定义的枚举类型,True的值相当于0,而False的值相当于1。当输入数字的时候,返回True,所以打印输出的是else部分的信息。要修改这个错误,可以采用如下两种方法。
方法一:将上面定义的枚举类型修改为如下形式。
enum Bool{
False,
True
};
这样使定义的枚举类型的值为1,而false的值为0,满足编译器的逻辑处理方法,不会再犯逻辑错误。
方法二:将main()函数中的实现方法修改为如下形式。
void main()
{
char c;
while(1)
{
printf("\n请输入:");
c=getch();
putchar(c);
if(is_number(c)==True)
printf("\n输入的是数字字符!");
else
printf("\n输入的是非数字字符!");
}
return;
}
修改main()函数之后,同样可以得到正确的结果。在if判断语句中,不再简单地通过返回值来打印输出信息,而是通过判断返回值与所需的返回值是否一致来打印输出信息。方法二比方法一更加严格,不易出错,所以建议读者在编写类似的代码时采用方法二。接下来通过一段完整的代码来演示方法二的使用,其功能为判断用户的选择。
include<stdio.h>
include<conio.h>
enum answ{
Yes,
No,
Error
};
enum answ answer()
{
enum answ ans;
char c;
printf("\n请输入你的选择:");
c=getch();
putchar(c);
if('Y'==c||'y'==c)
ans=Yes;
else if('N'==c||'n'==c)
ans=No;
else
ans=Error;
return ans;
}
void main()
{
enum answ ans;
while(1)
{
ans=answer();
if(ans==Yes)
printf("\n你的选择是Yes!");
else if(ans==No)
printf("\n你的选择是No!");
else
printf("\n输入有误!");
}
return;
}
运行结果:
请输入你的选择:y
你的选择是Yes!
请输入你的选择:n
你的选择是No!
请输入你的选择:d
输入有误!
请输入你的选择:
上面的代码采用了第二种方法,成功实现了对用户输入的判断。
在使用枚举类型的过程中需要注意,虽然枚举类型中的值均为整数值,但是不能对定义的枚举类型变量直接赋整数值,而应该进行强制转换,如:
include<stdio.h>
void main()
{
enum num{
one,
two,
three
}a;
a=(enum num)0;
if(a==one)
printf("将整数值通过强制转换成功赋值给枚举类型变量a\n");
else
printf("赋值失败!\n");
return;
}
运行结果:
将整数值通过强制转换成功赋值给枚举类型变量a
在上面的代码中,通过强制转换将整数值0赋值给枚举类型变量a,等价于a=one。如果不使用强制转换,只是简单地通过“=”号进行赋值操作,那么就会出现“error C2440:'=':cannot convert from'const int'to'enum main:num'”错误。
第1章讲解枚举类型时就提到了它和共用体有很大的相似之处,下面通过代码来看看它们之间的区别。
include<stdio.h>
void main()
{
enum compass{
East,
South,
West,
North
}a,b;
printf("枚举类型占用的内存大小为:%d个字节\n",sizeof(enum compass));
printf("枚举类型变量a占用的内存大小为:%d个字节\n",sizeof(a));
printf("枚举类型变量b占用的内存大小为:%d个字节\n",sizeof(b));
printf("枚举类型变量a的地址为:%d\n",&a);
printf("枚举类型变量b的地址为:%d\n",&b);
return;
}
运行结果:
枚举类型占用的内存大小为:4个字节
枚举类型变量a占用的内存大小为:4个字节
枚举类型变量b占用的内存大小为:4个字节
枚举类型变量a的地址为:1245052
枚举类型变量b的地址为:1245048
从上面的运行结果可以看出,对于定义的枚举类型,不管它包含多少个枚举常量,所占用的内存大小都为4字节,与所使用的整型类似;对于所定义的枚举类型变量,其占用的内存大小也是4字节,而不同枚举类型的变量所占用的是不同的内存单元,与之前讲解的共用体变量不同,共用体类型的变量占用同一片内存区域。上面定义的枚举类型变量a和枚举类型变量b所占用的是不同的内存区域。