【问题标题】:What does the following mean with respect to enumerations in C programming?以下对于 C 编程中的枚举意味着什么?
【发布时间】: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++ 的扩展

标签: c types enums


【解决方案1】:

每个enum case 获取前一个 case 的值加一,除非显式覆盖,第一个 case 的值为零。所以这里magpie0raven1,等等(引用的部分说否则是错误的。)最后一个案例corvid_num是数组中其他案例的计数,因为@987654327 @of that case 占一开始的零格。

数组初始化使用 C99 指定的初始化程序,它允许以任何顺序将值分配给特定索引,即 [raven] = "raven" 初始化索引 raven(此处为 1)。传统上可以按顺序列出每个值,但这样做可以重新排序枚举案例,而无需将更改与数组同步。

【讨论】:

    【解决方案2】:

    在声明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
    

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

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

    那么输出会变成

    Corvid 0 is the raven
    Corvid 1 is the magpie
    Corvid 2 is the jay
    

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 2015-07-30
      • 2020-10-12
      • 2016-01-02
      • 2010-10-21
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多