在我正在读的一本书中,枚举常量是在数组之前介绍的。仅通过几个示例演示了数组的使用。现声明如下:
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 开始,因此在我们的示例中,我们有
raven值magpie0、1、2jay和corvid_num3。最后的 3 显然是我们感兴趣的 3。
作者说 raven 的值应该为 0 而不是 magpie 是否正确,如果这是一个拼写错误,我的全部困惑都会消失。
在声明中,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)