枚举常量

2023-11-18

2011-04-28 12:20:31| 分类:C/C++语言 | 标签:c枚举变量|字号订阅

1、枚举常量的定义

enum 枚举类型名{常量1,常量2,常量3,.......};

例如定义一个星期的枚举常量:enum Week {Mon,Tue,Wed,.....};

这就定义了一个新的数据类型:Week。

Week数据类型来源于int类型(默认)。

Week类型的数据只能有7种取值,它们是:SUNDAY,MONDAY,TUESDAY……SATURDAY。

其中SUNDAY = 0,MONDAY = 1……SATURDAY = 6。也就是说,第1个枚举值代表0,第2个枚举值代表1,这样依次递增1。

不过,也可以在定义时,直接指定某个或某些枚举值的数值。比如,对于中国人,可能对于用0表示星期日不是很好接受,不如用7来表示星期天。这样我们需要的个值就是 1,2,3,4,5,6,7。可以这样定义:

enum Week {MONDAY = 1,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY};

我们希望星期一仍然从1开始,枚举类型默认枚举值从0开始,所以我们直接指定MONDAY等于1,这样,TUESDAY就将等于2,直接到SUNDAY等于7。

枚举值,我们就称为枚举常量,因为它一经定义以后,就不可再改变,以下用法是错误的!

TUESDAY = 10; //错误!我们不能改变一个枚举值的数值。

用枚举常量来完成表达今天是星期三:

Week today = TUESDAY;

2、枚举常量和宏定义的区别与联系

宏和枚举的主要区别是作用的时间和存储形式不同。宏定义是在编译预处理阶段作用的,也就是在编译预处理时,就会进行宏替换,将程序中的所有宏名替换为所定义的常量名,而枚举则是在程序运行之后才起作用的。宏定义不分配内存空间,而枚举常量存储在数据的静态存储区中(这一点一定要注意)。宏只占用代码段的空间,而枚举除了占用代码段空间外,还耗费CPU资源。

但是不能说宏就一定比枚举好,因为你定义一大堆的宏总是非常的不方便的。

3、枚举类型与sizeof运算符

下面是我在VS2008中的程序:

#include "stdafx.h"
#include "stdio.h"

enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun};
enum Boolean{True,fal};

int main(int argc, _TCHAR* argv[])
{
char c;
WEEK today;
Boolean bol;
printf("size of today is %d\n",sizeof(today));
printf("size of WEEK is %d\n",sizeof(WEEK));
printf("size of Boolean is %d\n",sizeof(Boolean));
printf("size of bol is %d\n",sizeof(bol));
c=getchar();
return 0;
}

运行结果全是:4

这是为什么呢?

这是因为枚举量是当做整型量来处理的,所以结果全部为4

再看下面一段程序:


#include "stdafx.h"
#include "stdio.h"

enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun};
enum Boolean{True,fal};
struct str1
{
enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun};
enum Boolean{True,fal};
};
struct str2
{
enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun} we;
enum Boolean{True,fal}bl;
};
struct str3
{};
int main(int argc, _TCHAR* argv[])
{
char c;
WEEK today;
Boolean bol;
str1 str1;
str2 str2;
str3 str3;
printf("size of today is %d\n",sizeof(today));
printf("size of WEEK is %d\n",sizeof(WEEK));
printf("size of Boolean is %d\n",sizeof(Boolean));
printf("size of bol is %d\n",sizeof(bol));
printf("size of str1 is %d\n",sizeof(str1));
printf("size of str2 is %d\n",sizeof(str2));
printf("size of str3 is %d\n",sizeof(str3));

printf("%d\n",&str1);
printf("%d\n",&str2);
printf("%d\n",&str3);
c=getchar();
return 0;
}

定义了三个结构体str1,str2和str3,在结构体一中没有定义任何变量,只定义了枚举常量,在结构体二中定义了变量,结构体三直接为一个空结构体,那么运行结果如何呢?

为什么结构体一和结构体三的sizeof都为1呢,这是因为在结构体1中实际上没有定义任何变量,相当于一个空结构体,空结构体有大小为1,因为这个东西还是存在的,所以就返回1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

枚举常量 的相关文章

  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • free() 是否跟随指针?

    我确信不是 但也许其中有黑魔法 所以这是我的问题 如果我有这样的结构 struct mystr char strp unsigned int foo 我为它分配了内存并想稍后释放它 我必须做吗 free mystr var gt strp
  • 如何在结构字段上创建可变迭代器

    所以我正在使用 Rust 开发一个小型 NES 模拟器 并且我正在尝试使用我的状态寄存器 寄存器是一个结构体 其中包含一些包含布尔值的字段 标志 寄存器本身是 CPU 结构体的一部分 现在 我想循环这些字段并根据我执行的某些指令设置布尔值
  • C++ 增量运算符

    如何区分重载运算符 的两个版本 const T operator const T rhs 哪一个 i i 对于非成员版本 只有一个参数的函数是前缀 而有两个参数的函数则第二个是int是后缀 struct X X operator X pre
  • 用 C 语言实现 FIFO 队列

    对于嵌入式应用程序 我尝试使用 ANSI C 实现先进先出 FIFO 结构队列 最直接的方法似乎是通过实现链表 以便每个结构包含指向队列中下一个的指针 因此我将结构本身定义为 typedef enum LED on LED off etc
  • 如何从 java 类(在 Lucee 中)中的方法返回 Coldfusion 结构?

    我正在编写一个java类 并且想从方法返回一个coldfusion结构 结构扩展了映射和其他东西 我不是 Java 程序员 所以我不知道如何解决这个问题 这是 lucee java 文档 http javadoc lucee org 当我尝
  • 结构有对象且无法复制

    我正在尝试从我的第一个 MQL4 专家顾问开始 我创建了一个struct处理我的订单 struct Order int pair int command double quantity double entry double stopLos
  • 我需要在 Swift 中 memset 一个 C 结构体吗?

    AFAIK 在 swift 中 调用类 结构的默认初始化程序会将所有内容初始化为0 nil 在 C 中 例如套接字编程 有时会使用 memset 在使用结构之前将所有内容设置为 0 我是否也需要在 swift 中使用 memset 还是我写
  • 如何编写一个函数来测试链接列表是否已排序

    我查看了其他帖子 但没有找到适合我的查询的很好的解决方案 我不想对链接列表进行实际排序 我想看看它是否已排序 我有一个 C 中的链表问题 我被要求编写一个给定链表定义的函数来查看它是否已排序 实现函数 isSorted 如果链表中的值按升序
  • 如何在 hive 中创建一个空的结构数组?

    我有一个观点Hive 1 1 0 根据条件 它应该返回一个空数组或一个数组struct
  • 将二进制文件读入结构体

    我正在尝试使用 C 读取二进制数据 我拥有有关我想要读取的文件中的数据布局的所有信息 我能够 逐块 读取数据 即将前 40 个字节的数据转换为字符串 然后获取接下来的 40 个字节 由于数据至少有三个略有不同的版本 我想将数据直接读入结构中
  • C 中的结构体数组初始化

    这是我的代码的一部分 我只想初始化arraylist 0 as arraylist 0 x 0 and arraylist 0 y 0 我不需要初始化结构体数组的其余部分 我该怎么做 谢谢 include
  • 如何在 Windows 8.1 中的 anaconda(python3.6) 中构建 cython pyx 到 pyd?

    我参考了一些网站在 Windows 8 1 中将 pyx 构建为 pyd 我正在使用带有 Spyder IDE 的 Anaconda Distribution 我已经开发了 pyx 文件 但无法在 Anaconda 命令提示符 中构建 水蟒
  • 如何将Matlab命令的输出重定向到文件? [复制]

    这个问题在这里已经有答案了 我想将 Matlab 命令的输出重定向或复制到文件中 我怎样才能做到这一点 就我而言 我想使用 UNIX 工具比较两个大型结构diff 示例 我可以在 Matlab 中执行此操作 gt gt s1 s1 a 32
  • sizeof() 函数如何用于 C 中的结构?

    结构体定义如下 typedef struct Sample int test char strtest Sample 在Main Function中 我将结构体称为Sizeof sizeof struct Sample 我听说结构体上 si
  • 数组如何在结构体中工作?

    如果我有例如 typedef struct node int numbers 5 node 每当我创建这样一个结构的实例时 都会在堆栈中为数组本身分配内存 在我们的例子中 20 个字节分配 5 个整数 将整数视为 32 位 并且数字将是指向
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC
  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe
  • 为什么Java不支持结构体? (只是出于好奇)

    我知道您可以使用公共字段或其他一些解决方法 或者也许你根本不需要它们 但只是出于好奇为什么 Sun 没有考虑结构 这是一个link http www oracle com technetwork java simple 142616 htm
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const

随机推荐