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所占用的是不同的内存区域。