首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请大家帮小弟我看两段关于emun的小代码吧,多谢

2012-03-31 
请大家帮我看两段关于emun的小代码吧,谢谢代码一,#includestdio.henum A{red,green,black}int main(){A

请大家帮我看两段关于emun的小代码吧,谢谢
代码一,
#include<stdio.h>
enum A{red,green,black};
int main()
{
A black;
black=green;
printf("%d\n",black);
printf("%d\n",sizeof(A));
return 0;

}
代码2,
#include<stdio.h>
int main()
{
  enum A{red,green,black};//就这行的位置不一样了。
A black;
black=green;
printf("%d\n",black);
printf("%d\n",sizeof(A));
return 0;

}
为什么代码2有问题而代码1可以运行呢?那为什么代码1的运行结果是1不是2呢?有人说emun是常量在数据段不在堆栈段是这样吗?那为什么没sizeof(emun A)=4而不是4*3呢?
再来一个小代码吧,
#include<stdio.h>
int main()
{
  enum A{red,green,black};
printf("%d\n",black);
return 0;

}
有些地方又说emun类似与struct在没申明一个变量时是不分配内存空间的,那这里为什么又可以直接输出black的值呢?
还有一个不解的地方,在网上看到一个段子,如下:
--------------------------------------------------------------------------
“如何确定一个enum的取值范围?
For example:
  enum e1{ a=2, b=4 };

首先找到其绝对值的最大值,但为了容易理解,我先不谈负数,也就是先找到其最大值,这里的最大值是4。
4 用二进制表示就是 100,也就是需要3bits才能最小的容纳下4这个值,而3bits所能表示的范围是 0-7,于是e1的取值范围为[0,7]。

现在来看看负数,
  enum e2{ a=-2, b=4 };
其中绝对值最大的是4,需要3bits才能容纳下,但因为可以取负值(而最大元素b=4不是负值),也就是说需要增加一个符号位,那么就需要4bits。
4bits的取值范围是 1000 - 0111(二进制表示),也就是 -8 到 7(十进制表示)。
enum e3{ a=-4, b=2 } 就只需要3bits,取值范围是[-4,3]。”
--------------------------------------------------------------------------
这里有点奇怪了,emun不是在数据段吗?也就是应该相当于一个常量吧,那怎么还有“取值范围”这种说法?

[解决办法]
第一个问题:
代码2中你应该把"A black"中的"black"换一个名,因为他和enum A{}中的"black"重名.
枚举也是一个基本的数据类型,占4个字节,所以不管它有多少个枚举变量,大小都不会改变.
枚举类型是常量
第二个问题:
enum A{a,b,c=5,d};
其值是:
a=0,b=1,c=5,d=6
[解决办法]
enum就是整形常量;
编译器已经可以确定具体的值,如果可以访问,它们每一个都可以当做全局常量来处理;

热点排行