C语言遍历枚举类型触发编译错误的原因及解决方法
问题分析与解决方法
错误原因
C标准中,枚举类型虽底层基于整数实现,但本身不属于整数类型范畴。++运算符要求操作数必须是整数、浮点或指针类型的可修改左值,枚举变量不满足这个要求,因此编译器会抛出no 'operator++(int)' declared的错误。
另外你原来的循环条件tone<Ti会漏掉Ti的调用——当tone等于La时,执行完Sound(La)后变量递增到Ti,此时Ti<Ti不成立,循环直接结束,Ti对应的音节不会被打印。
修改方案
方案一:显式类型转换实现枚举变量递增
将tone++替换为显式转换回枚举类型的表达式,同时修正循环条件:
int main(void) { Syllable tone; for (tone=Do; tone<=Ti; tone = (Syllable)(tone + 1)) Sound(tone); return 0; }
通过(Syllable)(tone + 1)把整数运算的结果强制转换回枚举类型,符合C标准的语法要求。
方案二:用整数变量遍历枚举值
直接利用枚举常量的整数特性,用int变量遍历,再转换为枚举类型传入函数:
int main(void) { for (int i = Do; i <= Ti; i++) Sound((Syllable)i); return 0; }
这种方式更简洁,也是C语言中遍历连续值枚举的常用写法。
内容的提问来源于stack exchange,提问作者Kim Minseo
相关产品推荐
相关产品推荐

