C语言枚举常量规则及数组指定初始化相关问题咨询
核心前提纠正
标准C中未显式赋值的枚举常量,默认从第一个元素开始从0依次递增,你给出的枚举定义:
enum corvid { magpie, raven, jay, corvid_num};
的正确取值是:magpie=0,raven=1,jay=2,corvid_num=3,书里把raven和magpie的取值写反了,属于明确笔误,这确实是你所有困惑的根源。
问题1解答
是的,[magpie] = "magpie" 是C的指定初始化器语法,作用就是给数组下标为magpie的位置赋值为字符串字面量"magpie"的首地址。
这种写法的优势是不受初始化列表的顺序影响,只要写对枚举和值的对应关系即可,可读性远高于按顺序写初始化值。
问题2逐个解答
1. bird[0]为什么等于"raven"?
如果你是按照书里错误的枚举取值(raven=0)来推导,这个结果成立的原因是:你用到的是指定初始化器显式赋值,和初始化列表的位置无关:你明确写了[raven] = "raven",如果raven的值被错误设定为0,那bird[0]自然就是"raven",和数组默认的按位置赋值逻辑没有关系。
如果按正确的枚举取值,bird[0]应该是"magpie",和你直觉的逻辑一致。
2. 第一次迭代结束后i+1对应的数组下标是否等于[magpie]?
按书里错误的枚举取值(raven=0,magpie=1):第一次迭代i=0,i+1=1,确实等于magpie的取值。
按正确的枚举取值(magpie=0,raven=1):i+1=1对应的是raven的取值。
3. 循环变量为什么用unsigned而非enum corvid类型?
这只是写法习惯的区别,没有强制要求,常见的考虑有两个:
- C标准没有规定枚举类型的符号性,不同编译器可能把枚举实现为有符号或无符号整数,用
unsigned可以避免符号相关的潜在边界问题 - 循环变量只用来做下标遍历,不需要强调枚举类型的语义,用基础整数类型写起来更简便
实际开发中用enum corvid作为循环变量类型完全合法,还能强化类型语义,是更推荐的写法。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

