以下对于 C 编程中的枚举意味着什么?

dex*_*ter 3 c enums types

在我正在读的一本书中,枚举常量是在数组之前介绍的。仅通过几个示例演示了数组的使用。现声明如下:

enum corvid { magpie, raven, jay, corvid_num};

char const * const bird [ corvid_num ] = 
{
  [raven] = "raven",
  [magpie] = "magpie",
  [jay] = "jay",
};

for ( unsigned i = 0; i < corvid_num ; ++i)
  printf ("Corvid %u is the %s\n", i, bird[i]);
Run Code Online (Sandbox Code Playgroud)

这声明了一个新的整数类型枚举 corvid,我们知道它的四个不同值。

要点 - 枚举常量具有显式值或位置值

正如您可能已经猜到的,位置值从 0 开始,因此在我们的示例中,raven 的值为 0,magpie 的值为 1,jay 的值为 2,corvid_num 的值为 3。最后的 3 显然是我们感兴趣的 3。

问题一:

是否[magpie] = "magpie"意味着magpieth 位置指的是 value "magpie"

问题2:

根据循环,howbird[0]等于"raven",因为这是显式的而不是位置值。此外,在第一次迭代之后[i + 1]将等于[magpie]。总而言之,为什么循环变量的类型是无符号的,而不是 corvid 或枚举 corvid?

我想我误解了枚举常量。

也来自,

正如您可能已经猜到的,位置值从 0 开始,因此在我们的示例中,我们有ravenmagpie0、1、2jaycorvid_num3。最后的 3 显然是我们感兴趣的 3。

作者说 raven 的值应该为 0 而不是 magpie 是否正确,如果这是一个拼写错误,我的全部困惑都会消失。

Lun*_*din 6

在声明中,char const * const bird [ corvid_num ] 两者之间的项目[ ]是数组的大小。在初始值设定项列表 中[ raven ] = " raven ", 之间的项[ ]是所谓的指定初始值设定项,用于初始化数组中的特定项。

问题 1:'[ magpie ] = " magpie "' 是否暗示 'magpie'TH 位置指的是值“magpie”。

是的。

问题2:根据循环,bird [0]如何等于“raven”,因为这是明确的而不是位置值。

因为枚举是命名常量。如果没有显式给枚举常量(raven等)提供数字,则会隐式给定一个数字,从 0 开始。raven在您的示例中,它是枚举中的第二项,因此它的值为 1,并且每当您输入raven源时,它都会相当于打字1

正如您可能已经猜到的,位置值从 0 开始,因此在我们的示例中,raven 的值为 0,magpie 的值为 1,jay 的值为 2,corvid_num 的值为 3。最后的 3 显然是我们感兴趣的 3。

这是Gustedt - Modern C中的错误。勘误表可能存在吗?示例代码的输出是:

Corvid 0 is the magpie
Corvid 1 is the raven
Corvid 2 is the jay
Run Code Online (Sandbox Code Playgroud)

值得注意的是,如果我们没有使用指定的初始值设定项而只是这样做:

char const * const bird [ corvid_num ] = 
{
    "raven",
    "magpie",
    "jay",
};
Run Code Online (Sandbox Code Playgroud)

那么输出就会变成

Corvid 0 is the raven
Corvid 1 is the magpie
Corvid 2 is the jay
Run Code Online (Sandbox Code Playgroud)