在K&R的《C程序设计语言》中2.3节提到:“尽管可以声明enum类型的变量,但编译器不检查这种类型的变量中存储到值是否为该枚举到有效值。不过,枚举变量提供这种检查,因此枚举比#define更具优势。”
非常不理解。enum类型的变量与枚举变量到底有什么区别?为什么前者不会检查而后者会呢?英文版如下描述:
还是很奇怪,后来网上看了多个帖子,终于明白了。
{
JAN = 1 , FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC
}months;
// months为枚举类型的变量
// JAN,FEB等为枚举有效值
#define Test "test"
months m;
// m为枚举变量
int main()
{
m = (months)Test; // 不检查
m = Test; // 检查
}
其中,
枚举类型的变量
为months。
枚举变量
为m;
m = Test; “Test”不是一个枚举有效值,编译器检查,会报错。
(修正:之前过于纠结字词的意义,加上对于概念理解的不透彻,解释过程中犯了错误。如今再次斟酌这句话想表达的意思,应该是说,当你声明枚举变量时,编译器不必检查变量中存储的是否是合法的枚举有效值。比如m = (months)Test 将"Test"强制转换为months类型,编译器没有检查m的值是否有效。但枚举变量提供了检查的机会, m = Test 时则进行了检查。虽然这样解释还是有点模糊,但基本可以按照下面补充的内容来理解。即当类型检查通过后,则不对实际值是否有效再进行检查。检查的是类型,而不是值。)
/**********************2011-05-06*************************/
补充:
关于这个问题,我有去请教了我们院的“c++之父”,终于得到了正确的理解。
K&R的意思,是指编译器会check变量的赋值是否是该enum类型的,但不会check赋值本身是否合法。
按“c++之父”的原话
“#define无类型检查,enum有。是否有效不管。”
“ 比如typedef enum{ ALPHA, GAMMA, BETA } EnType;”
“我声明个EnType eType = 5; 如果ALPHA = 0,那么eType是无效的。但是类型是有效的,所以编译器不会报错。”
所以说,我本来给的例子还是正确的,只是理解的还不够到位。“c++之父”名不虚传,一说我就懂了。