C语言 day19 | 我的日常分享

C语言 day19

共用体 枚举

共用体(联合体)

共用体与结构体的区别

1、结构体关键字:struct
每个成员拥有独立的空间

2、共用体关键字:union
所有成员共享同一份空间

共用体的空间大小

公用体的空间大小由最大的成员决定

1
2
3
4
5
6
union data1{
char a;
int b;
short c;
};
printf("%d\n",sizeof(union data1));

运行结果:
图片

分析:union data1 成员中最大的为 int b 占4字节

案例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
union data1{
char a;
int b;
short c;
};
int main(int argc,char *argv[]){
union data1 z;
z.a=10;
z.b=20;
z.c=30;
printf("%d\n",z.a+z.b+z.c);

return 0;
}

运行结果:
图片

分析:因为空间是公用的,前面空间被赋的值被后面赋的值覆盖了,然而三个变量指向的是同一个空间,而且取出来的都是30,所以结果为90

案例2:

问:由案例1得出,共用体是最后一次赋值才有效,这个结论是对是错?(不严谨,错的)

共用体虽然公用同一份空间,但是从空间读取的字节数是由成员自身类型决定的(重要)

图片

问:下面代码的输出结果?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
union data1{
char a;
short b;
int c;
};
int main(int argc,char *argv[]){
union data1 z;
z.c=0x01020304;
z.b=0x0102;
z.a=0x01;
printf("%#x\n",z.a+z.b+z.c);

return 0;
}

运行结果:
图片

分析:
注意,倒着存倒着取
图片




枚举

  • 将变量的值一一列举出来,变量的值仅限于列举出来的值的范围内

  • 枚举的定义:

    1
    2
    3
    enum 枚举名{
    枚举值表
    };

    在枚举值表中应列出所有可用值,也称为枚举元素
    枚举变量仅能取枚举值表中所列的元素

引入

试想一下,如果不用枚举,一个星期7天我们要用#define来为每个整数定义一个宏(别名)

1
2
3
4
5
6
7
#define MON  1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

如果用枚举:

1
2
3
4
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};

这样代码就简洁多了,实际上枚举就是一个个的宏

注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

枚举变量的定义和使用

1、先定义枚举类型,在定义枚举变量

1
2
3
4
5
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

2、定义枚举类型的同时定义枚举变量

1
2
3
4
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

3、省略枚举名称,直接定义枚举变量

1
2
3
4
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

可以在定义枚举改变枚举元素的值

1
2
enum season {spring, summer=3, autumn=8, winter};
printf("%d %d %d %d\n",spring,summer,autumn,winter);

运行结果:
图片

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};

int main()
{
enum DAY day;
day = WED;
printf("%d",day);
return 0;
}

运行结果:
图片

案例:枚举在 switch 中的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main(int argc,char *argv[])
{
enum color { red=1, green, blue };
enum color favorite_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;
}

运行结果:
图片