【发布时间】:2022-01-06 23:15:47
【问题描述】:
在我正在阅读的一本书中,枚举常量已在数组之前引入。仅通过几个示例演示了数组的使用。声明如下:
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]);
这声明了一个新的整数类型 enum corvid,我们知道它有四个不同的值。
外卖 - 枚举常量具有显式值或位置值
您可能已经猜到了,位置值从 0 开始,所以在我们的示例中 我们有值为 0 的 raven,值为 1 的 magpie,值为 2 的 jay,值为 3 的 corvid_num。最后一个 3 显然是我们感兴趣的 3。
问题一:
[magpie] = "magpie" 是否暗示magpieth 位置指的是值"magpie"。
问题 2:
根据循环,bird[0] 如何等于 "raven" ,因为这是明确的而不是位置值。同样在第一次迭代之后,[i + 1] 将等于 [magpie]。为什么循环变量的类型是 unsigned 而不是 corvid 或 enum corvid?
我想我误解了枚举常量。
也来自,
您可能已经猜到了,位置值从 0 开始,因此在我们的示例中,
raven的值为 0,magpie的值为 1,jay的值为 2,corvid_num的值为 3。最后一个3 显然是我们感兴趣的 3。
作者说 raven 的值应该是 0 而不是 magpie 是否正确,如果这是一个错字,我的全部困惑都会消失。
【问题讨论】:
-
作者错了。由于未明确分配值,因此第一个枚举将为 0,随后的枚举将递增 1。因此对于枚举,magpie 为 0 ,raven 为 1,jay 为 2,corvid_num 为 3
-
这是一个错字。您可以通过打印枚举值来检查,例如
printf("%d\n", magpie);将打印 0。 -
这是一种初始化数组的奇怪方式..
-
@hetepeperfan 为什么奇怪?这是一种将枚举值映射到其名称以便在需要时打印它们的简单方法。如果您在枚举列表的中间添加新值也是安全的。
-
@alagner 这是自 C99 以来的标准 C。你可能指的是 C++ 的扩展