对enum的探讨
最近在看《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;
}
學習中的一己之見,如有錯誤,請務必指出,感謝!
轉載于:https://www.cnblogs.com/svking/archive/2011/12/08/enum.html
總結
- 上一篇: 《侠侣天下》资料片武魂大揭晓
- 下一篇: Struts2学习笔记(六):Strut