最近在看《Linux C编程一站式学习》,在83页上看到了这么一句话“枚举的成员名却和变量名在同一个命名空间中,
所以会出现命名冲突”。忽然感觉C语言中枚举是有点”猫腻“的。由于当时在图书馆所以只能先用自己这不好用的
脑袋先来猜想一下枚举的实现:枚举的每个成员实际是一个变量,他被赋予了相应的值,由于枚举的每个成员
实际代表着0,1,2这样的整数值,所以进一步猜想枚举的每个成员是一个int类型的变量。所以有了枚举的这些特性:
1)变量名不能和枚举成员重名
2)枚举成员实际对应着0,1,2这样的整数
3)不同的成员可以对应着同一个整数(相当与int a,b;a=b=1;)
可是这毕竟是我的猜想,对不对还要在电脑上测试一下。
#include <stdio.h>
int main()
{
enum a {b,c};
enum d {e,f};
return 0;
}
先敲上如上的代码(我用vc6.0,因为调试方便。。。想鄙视的就尽情的鄙视吧... )
然后用debugger查看b和e的地址结果却是:00000000,00000000
地址怎么会相同呢?(其实高手估计已经猜到了怎么回事,不过我太菜,还是不明白)
赋值一下试试
#include <stdio.h>
int main()
{
enum a {b=256,c};
enum d {e=256,f};
return 0;
}
结果b的e的地址都为00000100,还是相同。
为什么会有相同的地址呢,这个地址是什么意思呢?
在后来的调试中,突然注意到了一个词:constant
是的,没错就是constant!b、c、e和f其实constant,是对整形常量的取别名,这样就可以解释上面的一切了,
调试的时候我输入b和e被解释为对应的常数了,等于直接查看了地址。。。。。。
好吧,现在来验证一下b、c、e和f是整形常量
这个为b赋值为1是错误的,而且说明了b不是左值
#include <stdio.h>
int main()
{
enum a {b=256,c};
enum d {e=256,f};
int i=b;
b=1; //error C2106: '=' : left operand must be l-value
return 0;
}
这个程序是正确的:
#include <stdio.h>
int main()
{
enum a {b=256,c};
enum d {e=256,f};
enum a g=b; //b是enum a中定义的
enum a h=e; //e是enum d中定义的!!!
int i=b;
printf("%d\t%d\t%d\n",g,h,i);
return 0;
}
输出:256256 256
总结:其实所谓的枚举就是对int取个别名,如enum a{};和typedef int int_;是相同的效果。而枚举{}中的成员实际就是对相应的整形常量进行了取别名,
就是#define b 256这样的效果罢了。而且这些别名在对应的作用域可以和整形常量一样使用。
再来个例子
#include <stdio.h> //改程序没有问题(vc6.0和codeblocks)
#define one 1
int main()
{
enum a {b=256,c=one};
enum d {e=256,f};
typedef int int_;
int_i;
enum a j;
intk;
i=e;
j=e;
k=e;
i=j;
j=i;
k=j;
j=k;
i=k;
k=i;
i=0;
j=0;
k=0;
return 0;
}
学习中的一己之见,如有错误,请务必指出,感谢!