在我正在阅读的一本书中,枚举常量是在数组之前引入的。仅通过几个示例演示了数组的使用。兹说明如下:
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,我们知道它有四个不同的值。引用-枚举常量具有显式或位置值,正如您可能已经猜到的,位置值从0开始,所以在我们的示例中,我们使用了raven值为0,喜鹊值为1,jay值为2,corvid_num值为3。最后的3显然是我们感兴趣的3。
问题1:
[magpie] = "magpie"是否意味着magpieth位置指的是值"magpie"。
问题2:
根据循环,bird[0]如何等于"raven",因为这是显式的,而不是位置值。同样,在第一次迭代之后,[i + 1]将等于[magpie]。为什么循环变量的类型是无符号的,而不是corvid或enum?
我想我误解了枚举常量。
也来自,
正如您可能已经猜到的那样,位置值从0开始,所以在我们的示例中,
值为0,
magpie值为1,jay值为2,corvid_num值为3,这显然是我们感兴趣的3。
作者说得对,乌鸦应该有价值0而不是喜鹊,如果这是个错误,我的困惑就会完全消失。
发布于 2021-11-30 08:30:29
在声明char const * const bird [ corvid_num ]中,[ ]之间的项是数组的大小。在初始化程序列表[ raven ] = " raven "中,[ ]之间的项是一个所谓的指定初始化器,用于初始化数组中的特定项。
问题1:‘喜鹊=’喜鹊‘是否意味着’喜鹊‘的位置是指值“喜鹊”。
是。
问题2:根据循环,鸟类如何等同于“乌鸦”,因为这是显式的,而不是位置值。
因为枚举被命名为常量。如果一个枚举常量(raven等)没有显式地给出一个数字,它就被隐式地给出一个,从0开始。示例中的raven是枚举中的第二项,因此它获得值1,并且每当您在源中键入raven时,它将等同于键入1。
正如您可能已经猜到的,位置值从0开始,所以在我们的示例中,我们使用了值0的乌鸦,带有1的喜鹊,带2的Jayand3,这显然是我们感兴趣的3。
这是Gustedt的一个错误--现代的C. Errata可能存在?示例代码的输出是:
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发布于 2021-11-30 08:30:11
除非显式重写,否则每个enum大小写都会获得上一个大小写的值加上一个,第一个大小写的值为零。在这里,magpie是0,raven是1,等等(引用的部分说不正确)。最后一个大小写corvid_num是数组中其他情况的计数,因为该情况的+ 1在开始时表示为零大小写。
数组初始化使用C99指定的初始化器,它允许为特定索引分配值,并按任何顺序,即[raven] = "raven"初始化索引raven (此处为1)。传统上只按顺序列出每个值是可能的,但这样做可以重新排序枚举案例,而不必与数组同步更改。
https://stackoverflow.com/questions/70165988
复制相似问题