枚举的介绍和使用
枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义格式为:
enum 枚举名 {枚举元素1,枚举元素2,……};
注意:各枚举元素之间用逗号分隔,最后一个枚举元素后不加“ ; ”号。
//枚举
enum Num//枚举名
{
one, two, three, four, five//枚举元素
};
枚举变量的定义
前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。
我们可以通过以下三种方式来定义枚举变量
1、先定义枚举类型,再定义枚举变量
enum Num//枚举名
{
one, two, three, four, five//枚举元素
};
enum Num num;
2、定义枚举类型的同时定义枚举变量
enum Num//枚举名
{
one, two, three, four, five//枚举元素
}num;//枚举变量
3、省略枚举名称,直接定义枚举变量
enum
{
one, two, three, four, five//枚举元素
}num;//枚举变量
在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,且如果修改枚举元素的值第一个元素的值会默认为0;如下:
enum Num
{
one, two, three, four, five
}num;
int main()
{
num = one; printf("%d\n", num);
num = two; printf("%d\n", num);
num = three; printf("%d\n", num);
num = four; printf("%d\n", num);
num = five; printf("%d\n", num);
return 0;
}
输出
当修改前一个枚举元素初值时,后一个枚举元素值为前一个枚举元素值加1;如下:
枚举的使用
个人认为枚举最实用的就是swich条件循环。很清晰的表达:
#include <stdio.h>
#include <stdlib.h>
int main()
{
enum color { red=1, green, blue };
enum color favorite_color;
/* ask user to choose color */
printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
scanf("%d", &favorite_color);
/* 输出结果 */
switch (favorite_color)
{
case red:
printf("你喜欢的颜色是红色");
break;
case green:
printf("你喜欢的颜色是绿色");
break;
case blue:
printf("你喜欢的颜色是蓝色");
break;
default:
printf("你没有选择你喜欢的颜色");
}
return 0;
}
位域的介绍和使用
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
简而言之:
带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数。
使用位域的好处
1.有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。这样节省存储空间,而且处理简便。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
2.可以很方便的利用位域把一个变量给按位分解。比如只需要4个大小在0到3的随即数,就可以只rand()一次,然后每个位域取2个二进制位即可,省时省空间。
例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,如下:
struct
{
unsigned int age : 3;
} Age;
位域的声明和定义
在结构内声明位域的形式如下:
struct
{
type [member_name] : width ;
};
元素 | 描述 |
---|---|
type | 整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。 |
member_name | 位域的名称。 |
width | 位域中位的数量。宽度必须小于或等于指定类型的位宽度。 |
位域的声明定义和枚举一样
1.先定义位域后定义变量
struct Age
{
unsigned int age : 3;
};
struct Age Age;
2.声明同时定义
struct Age
{
unsigned int age : 3;
}Age;
3.忽略位域定义,直接定义变量
struct
{
unsigned int age : 3;
} Age;
#include <stdio.h>
struct
{
unsigned int age : 3;
} Age;
int main( )
{
Age.age = 4;
printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
printf( "Age.age : %d\n", Age.age );
Age.age = 7;
printf( "Age.age : %d\n", Age.age );
Age.age = 8; // 二进制表示为 1000 有四位,超出
printf( "Age.age : %d\n", Age.age );
return 0;
}
当上面的代码被编译时,它会带有警告,当上面的代码被执行时,它会产生下列结果
位段的跨平台问题
- int 位段被当成有符号数还是无符号数是不确定的。
- 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
- 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位,还是利用,这是不确定的。