有时候枚举只返回一项会显得不够用,比如新建一个枚举类型week它总共有7项分别代表周日到周一,声明一个week类型的枚举值work用来表示一个人的值日安排,这个人的值日安排可能不止一天,如果work的值只能为week7个枚举项中的一个显然是不够用的。这时候就需要用到枚举的组合。
|和||,&和&&的区别
想要使用枚举的组合就需要知道|和||。&和&&之间的关系
“|”和“||”
“|”和“||”都可以表示逻辑或运算,不同的是做逻辑或运算时”|”会检查每一个条件再进入下一步,而”||”则相反,它会从左往右直到遇到条件为真就立即进入下一步。
“&”和“&&”
“&”和“&&”都可以表示逻辑与运算,不同的是做逻辑与运算时”&&”会检查每一个条件再进入下一步,而”&&”则相反,它会从左往右直到遇到条件为假就跳出然后进入下一步不再检验剩余条件是否成立。这也是”&&“的短路功能。
ps: “&”和”|”与”&&”和”||”相比还多了位运算的功能,当&的两边不是布尔类型时&表示按位与运算;当”|“的两边不是布尔类型时”|“表示按位或运算。**
//test.h
#include<stdio.h>
#include<string.h>
typedef enum WEEK {
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday=64
}Week;
void printWeek(Week src)
{
char dst[MAXSIZE] = { 0 };
if ((src&Monday) == Monday)
strcat(dst, "Monday ");
if ((src&Tuesday) == Tuesday)
strcat(dst, "Tuesday ");
if ((src&Wednesday) == Wednesday)
strcat(dst, "Thursday ");
if ((src&Thursday) == Thursday)
strcat(dst, "Monday ");
if ((src&Friday) == Friday)
strcat(dst, "Friday ");
if ((src&Saturday) == Saturday)
strcat(dst, "Saturday ");
if ((src&Sunday) == Sunday)
strcat(dst, "Sunday ");
printf("%s", dst);
};
int main()
{
Week work = Monday | Thursday | Saturday;
printWeek(work);
getchar();
return 0;
}
运行结果如下:
这种组合使用是基于二进制和位运算的原理,在定义枚举Week时 每个枚举项的值都为2的次方,转化为二进制就会出出现只有1位为1其他位都为0的情况。这样在两个值为 2的不同次幂的或运算后他们各自的标志位就会整合到一块。再与其它枚举值做按位与就可以知道是否含有此枚举值。