1.枚举类型:enum
枚举适用于定义常量命名的,对于如何理解定义常量命名,可以参考 #define,即将100的命名替换成 MAX。这有利于提高代码的可读性。
#define MAX 100
在下面的代码中:也进行了常量的命名自定义,枚举类型中的元素默认从0开始依次递增,也就是说Monday=0,Tuesday=1,但是也可以自己修改,Monday=1,Tuesday=2,也可以只修改其中的一个数值,记住除赋值外,依次比上面+1。此外,字符也可以是被命名的常量,字符相当于阿斯克码值。
#include <stdio.h>
// 定义枚举类型
enum Weekday {
Monday,//0
Tuesday,//1
Wednesday=5,
Thursday,//6
Friday,//7
Saturday,//8
Sunday//9
};
int main() {
// 声明枚举变量
enum Weekday today;
// 给枚举变量赋值
today = Wednesday;
// 使用枚举变量
if (today == Wednesday) {
printf("Today is Wednesday.\n");
} else {
printf("Today is not Wednesday.\n");
}
return 0;
}
因为是定义常量命名,所以在 today == Wednesday条件判断上也可以写成 today == 2,如果枚举中Wednesday='w',那么在条件判断可以写成 today == 'w'。
枚举可以使赋值变的可读,可以简化代码,并增加代码的可读性和可维护性。
2.联合类型:union
联合是一种特殊的数据类型,允许在同一内存位置存储不同的数据类型。与结构体类似,联合可以包含多个成员,但是在任何给定时间只有一个成员可以拥有值。
#include <stdio.h>
union UnionType {
int intValue;
float floatValue;
};
也就是说每次调用联合类型的变量时,只能用一个成员,如下:
int main() {
union UnionType value;
value.intValue = 42;
printf("Integer value: %d\n", value.intValue);
value.floatValue = 3.14;
printf("Float value: %f\n", value.floatValue);
printf("Integer value after float assignment: %d\n", value.intValue);
return 0;
}
联合因为一次只能使用一个成员,所以在内存存放上也有特点:
联合的内存大小通常是其成员中占用内存最大的那个成员的大小。这是因为联合中的所有成员共享同一块内存空间,该空间的大小必须足够大,能够容纳联合中最大的成员。
对于上面的代码来说,有int 和 float类型,内存大小就是8(大的那个),如果成员有数组,比如:
#include <stdio.h>
union UnionType {
int intValue;
char array[10];
};
这里内存大小是12而不是10,是因为这里存在对齐,char类型的对齐数是1,int类型对齐数是4,所以内存大小是最大内存的成员再进行对齐,最后得到12。(和struct结构体不同,如果是结构体那么内存会是4+10再对齐是16)