枚举变量保存符号
有时你不想保存数字或文本,而是想保存一组符号。如果你想记录一周中的某一天,只想保存MON-DAY、TUESDAY、WEDNESDAY……这些符号。你不需要保存文本,因为一共只有七种不同的取值。
这就是为什么要发明枚举的原因。
有了枚举,就可以创建一组这样的符号:
用enum colors
类型定义的变量只能设为列表中的某个关键字。可以像下面这样定义enum colors
变量:
enum colors favorite = PUCE;
在幕后,计算机会为列表中的每个符号分配一个数字,枚举变量中也只保存数字。至于是什么数字,你完全不用操心,C程序员只要在代码中写符号就行了。枚举不仅让代码更易于阅读,同时它也能够防止你把值保存成REB
或PUSE
:
枚举就是这么工作的,但如何用它来记录联合保存了哪个字段呢?来看一个例子……
结构与联合用分号(;)来分割数据项,而枚举用逗号。
代码冰箱贴
你既然能用枚举创建新的数据类型,也就能把它保存在结构或联合中。下面这个程序用枚举变量来记录“量”的类型,你能找到丢失的代码吗?
#include <stdio.h>
typedef enum {
COUNT, POUNDS, PINTS
} unit_of_measure;
typedef union {
short count;
float weight;
float volume;
} quantity;
typedef struct {
const char *name;
const char *country;
quantity amount;
unit_of_measure units;
} fruit_order;
void display(fruit_order order)
{
printf("This order contains ");
if (...............== PINTS)
printf("%2.2f pints of %s\n", order.amount. ..............., order.name);
else if (................ == ..............)
printf("%2.2f lbs of %s\n", order.amount.weight, order.name);
else
printf("%i %s\n", order.amount. ..............., order.name);
}
int main()
{
fruit_order apples = {"apples", "England", .amount.count=144, ...............};
fruit_order strawberries = {"strawberries", "Spain", .amount. ........=17.6, POUNDS};
fruit_order oj = {"orange juice", "U.S.A.", .amount.volume=10.5, ...............};
display(apples);
display(strawberries);
display(oj);
return 0;
}
代码冰箱贴解答
你既然能用枚举创建新的数据类型,也就能把它保存在结构或联合中。下面这个程序用枚举变量来记录“量”的类型,你找到丢失的代码了吗?
联合:……于是我对代码说,“瞧,不管你给我的是不是float
,只要你问我要int
,我就给你int
。”
结构:哥们,这么做完全没有道理。
联合:就是没有道理。
结构:人人都知道你只有一块存储空间。
联合:是的,万物一体,佛曰……
枚举:发生了什么?
结构:枚举,闭嘴,这个家伙太过分了。
联合:如果用户只给出一条记录,比如在这个例子中,我就把它保存成int
,只要用枚举或其他东西记录一下就行了。
枚举:你想让我来做这件事?
结构:闭嘴,枚举。
联合:如果用户希望一次保存多条数据,就应该用你,对吗?
结构:这群人根本不知道什么是秩序。
枚举:什么是秩序?
结构:秩序意味着独立且有序。我在存储器中相继摆放数据,同时保存所有数据。
联合:不错。
结构:同时保存所有数据(字正腔圆)。
枚举:(停顿)有问题吗?
联合:小声点,枚举。我认为这需要由用户来决定,如果他想保存多条数据,就用你;如果想保存有多种类型的数据,就选我。
结构:我给他打个电话。
联合:喂,等等……
枚举:他在给谁打电话,哥们?
结构/联合:闭嘴,枚举。
联合:别惹麻烦了,行吗?
结构:喂?请帮我接蓝牙服务。
联合:喂,我们再考虑一下。
结构:什么?让他过会儿给我回电话?
联合:也许这不是一个好主意。
结构:不用,帮我传句话,朋友。
联合:求你把电话挂掉。
枚举:电话那头是谁?
结构:小声点,枚举,没看见我在打电话么?听好了,你只要告诉他说,如果他想保存float
和int
变量就来找我,要么我去找他,明白了吗?喂?喂?
联合:沉住气,冷静。
结构:我X,转接中!
联合:怎么了?把电话给我……不……电话里在放老鹰乐队的歌!我讨厌老鹰乐队……
枚举:你之所以那么胖,就是因为把字段打包在了一起?
结构:朋友,我们到外面聊两句。