c - C中的这些枚举有什么区别?
问题描述
C新手,所以我在这里感到困惑。
我有三个不同的枚举
enum Space{STAR = 6, PLANET, SUN =3, EARTH =5, PLUTO};
typedef enum {STAR = 6, PLANET, SUN =3, EARTH =5, PLUTO}System;
typedef enum Space{STAR = 6, PLANET, SUN =3, EARTH =5, PLUTO}System;
这三者之间究竟有什么区别?
我知道它们是 int 类型的有序变量集,因此 PLANET = 7、PLUTO = 6 等。
但是我尝试打印这些值,但它们似乎都一样。
printf("%d", PLANET);
解决方案
这可能看起来很奇怪或令人困惑,但是:结构、联合和枚举最终可能在 C 中具有两个(或多个)不同的名称。
第一个并且在某种意义上更基本的名称通常称为“标签”。这是您的第一个示例中的名称:
enum Space {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO};
我们创建了一个新的枚举(实际上是一个新类型),描述了 5 个枚举常量,我们给它命名为“ Space
”。
标签名称不是全局的——单词“ Space
”不足以唯一标识我们创建的这种新类型。如果我们想声明一个可以保存这种新枚举类型值的变量,我们必须enum
在这样做时重复关键字:
enum Space spacevar;
如果我们试着说
Space spacevar;
编译器会抱怨,因为Space
它不是类型名称,它只是一个标签名称。
(这有点像美国地理中的“华盛顿”这个名字。它是指太平洋西北部的华盛顿州,还是华盛顿特区?我们总是需要更多的信息,一个额外的词或缩写,以确定。)
然后我们来到 typedefs。typedef 确实创建了一个新的类型名称(对于现有类型)。typedef 可以“包含”大量信息。如果我们说
typedef int myint;
thenmyint
只是 的同义词int
。但是如果我们说
typedef int *intptr;
thenintptr
表示“指向”的指针int
,它“包含” *
; 我们可以稍后说
intptr p1, p2;
我们得到两个指针。同样,如果我们说
typedef enum Space System;
thenSystem
是一个新的类型名称,意思是“ enum Space
”,它“包含”关键字enum
。稍后我们可以声明另一个枚举类型的变量
System spacevar2;
这与
enum Space spacevar2;
除了当我们使用System
声明spacevar2
变量时,我们不必重复那个enum
关键字。
所以现在我们可以回到你的第二个和第三个例子。你的第三个例子,
typedef enum Space {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO} System;
在同一行同时声明标签名称Space
和类型名称。System
就好像你说过
enum Space {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO} System;
typedef enum Space System;
在两条线上。
然后你的第二个例子
typedef enum {STAR = 6, PLANET, SUN = 3, EARTH = 5, PLUTO} System;
创建相同的新类型,除了它只给它一个类型名称,而不是一个标签名称。这为您提供了一个枚举类型,您可以在其中仅使用类型名称形式声明新变量:
System spacevar3;
在这种情况下,你不能说
enum ??? spacevar3
因为您还没有声明可以在???
现场使用的标签名称。
但最后,无论您使用哪种形式以及如何声明枚举变量,您都可以以相同的方式使用它们。你可以说
spaceval = STAR;
和
spaceval2 = PLANET;
和
spaceval3 = SUN;
根据您用来定义变量的名称(标签名称或类型名称),您必须使用不同的方式来使用变量。
推荐阅读
- ios - Swift UI - 图片库上的按钮返回
- javascript - 谷歌浏览器上的休息 API
- node.js - 添加规则时出现 Eslint 错误 @typescript-eslint/interface-name-prefix
- java - 如何创建文件名 + 查询参数请求
- c# - 实体框架在查询中创建不存在的列
- java - Java8 Stream api比较列表
- angular - 创建新模块时抛出对装饰器的实验性支持错误
- python - 将数据帧存储为 csv 格式的问题
- python - Kivy Image Widget - 模块对象不可调用
- python - 安装 Setuptools-scm Pypi 时出现错误为“ValueError:Zip 不支持 1980 年之前的时间戳”