对enum的探讨
最近在看《Linux C編程一站式學(xué)習(xí)》,在83頁(yè)上看到了這么一句話“枚舉的成員名卻和變量名在同一個(gè)命名空間中,
所以會(huì)出現(xiàn)命名沖突”。忽然感覺(jué)C語(yǔ)言中枚舉是有點(diǎn)”貓膩“的。由于當(dāng)時(shí)在圖書館所以只能先用自己這不好用的
腦袋先來(lái)猜想一下枚舉的實(shí)現(xiàn):枚舉的每個(gè)成員實(shí)際是一個(gè)變量,他被賦予了相應(yīng)的值,由于枚舉的每個(gè)成員
實(shí)際代表著0,1,2這樣的整數(shù)值,所以進(jìn)一步猜想枚舉的每個(gè)成員是一個(gè)int類型的變量。所以有了枚舉的這些特性:
1)變量名不能和枚舉成員重名
2)枚舉成員實(shí)際對(duì)應(yīng)著0,1,2這樣的整數(shù)
3)不同的成員可以對(duì)應(yīng)著同一個(gè)整數(shù)(相當(dāng)與int a,b;a=b=1;)
可是這畢竟是我的猜想,對(duì)不對(duì)還要在電腦上測(cè)試一下。
#include <stdio.h>
int main()
{
enum a {b,c};
enum d {e,f};
return 0;
}
先敲上如上的代碼(我用vc6.0,因?yàn)檎{(diào)試方便。。。想鄙視的就盡情的鄙視吧... )
然后用debugger查看b和e的地址結(jié)果卻是:00000000,00000000
地址怎么會(huì)相同呢?(其實(shí)高手估計(jì)已經(jīng)猜到了怎么回事,不過(guò)我太菜,還是不明白)
賦值一下試試
#include <stdio.h>
int main()
{
enum a {b=256,c};
enum d {e=256,f};
return 0;
}
結(jié)果b的e的地址都為00000100,還是相同。
為什么會(huì)有相同的地址呢,這個(gè)地址是什么意思呢?
在后來(lái)的調(diào)試中,突然注意到了一個(gè)詞:constant
是的,沒(méi)錯(cuò)就是constant!b、c、e和f其實(shí)constant,是對(duì)整形常量的取別名,這樣就可以解釋上面的一切了,
調(diào)試的時(shí)候我輸入b和e被解釋為對(duì)應(yīng)的常數(shù)了,等于直接查看了地址。。。。。。
好吧,現(xiàn)在來(lái)驗(yàn)證一下b、c、e和f是整形常量
這個(gè)為b賦值為1是錯(cuò)誤的,而且說(shuō)明了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;
}
這個(gè)程序是正確的:
#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
總結(jié):其實(shí)所謂的枚舉就是對(duì)int取個(gè)別名,如enum a{};和typedef int int_;是相同的效果。而枚舉{}中的成員實(shí)際就是對(duì)相應(yīng)的整形常量進(jìn)行了取別名,
就是#define b 256這樣的效果罷了。而且這些別名在對(duì)應(yīng)的作用域可以和整形常量一樣使用。
再來(lái)個(gè)例子
#include <stdio.h> ?//改程序沒(méi)有問(wèn)題(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;
}
學(xué)習(xí)中的一己之見,如有錯(cuò)誤,請(qǐng)務(wù)必指出,感謝!
轉(zhuǎn)載于:https://www.cnblogs.com/svking/archive/2011/12/08/enum.html
總結(jié)
- 上一篇: 《侠侣天下》资料片武魂大揭晓
- 下一篇: Struts2学习笔记(六):Strut