C/C++編程筆記:C語言枚舉與聯(lián)合的區(qū)別,幫你一步步深度解析
聯(lián)合與枚舉很多小伙伴老是搞混了,這次記下來,與大家分享,希望大家能夠有所收獲。
enum是枚舉型
union是聯(lián)合型,共用體,成員共用一個變量緩沖區(qū)?現(xiàn)在基本已經(jīng)不用了。

枚舉類型?
在實(shí)際問題中,有些變量的取值被限定在一個有限的范圍內(nèi)。例如,一個星期內(nèi)只有七天,一年只有十二個月,一個班每周有六門課程等等。如果把這些量說明為整型,字符型或其它類型顯然是不妥當(dāng)?shù)?。為此,C語言提供了一種稱為“枚舉”的類型。在“枚舉”類型的定義中列舉出所有可能的取值,被說明為該“枚舉”類型的變量取值不能超過定義的范圍。應(yīng)該說明的是,枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構(gòu)造類型,因?yàn)樗荒茉俜纸鉃槿魏位绢愋汀?/p>
?1.1?枚舉類型的定義和枚舉變量的說明?
1.?枚舉的定義枚舉類型定義的一般形式為:?????enum?枚舉名{?枚舉值表?};
在枚舉值表中應(yīng)羅列出所有可用值。這些值也稱為枚舉元素。
2.?枚舉變量的說明
如同結(jié)構(gòu)和聯(lián)合一樣,枚舉變量也可用不同的方式說明,即先定義后說明,同時定義說明或直接說明。
設(shè)有變量a,b,c被說明為weekday,可采用下述任一種方式:
????????enum?weekday{?sun,mou,tue,wed,thu,fri,sat?};
? ? ? ? enum?weekday?a,b,c;?
? ? ? ? 或者為:
? ? ? ? enum?weekday{?sun,mou,tue,wed,thu,fri,sat?}a,b,c;?
? ? ? ? 或者為:
? ? ? ? enum?{?sun,mou,tue,wed,thu,fri,sat?}a,b,c;
?1.2?枚舉類型變量的賦值和使用?枚舉類型在使用中有以下規(guī)定:?
1.?枚舉值是常量,不是變量。不能在程序中用賦值語句再對它賦值。
例如對枚舉weekday的元素再作以下賦值:?????sun=5;?mon=2;?sun=mon;?都是錯誤的。
2.?枚舉元素本身由系統(tǒng)定義了一個表示序號的數(shù)值,從0開始順序定義為0,1,2…。
如在weekday中,sun值為0,mon值為1,…,sat值為6。
【例】?main(){?
?enum?weekday?
?{?sun,mon,tue,wed,thu,fri,sat?}?a,b,c;??
a=sun;?????b=mon;?????c=tue;
printf("%d,%d,%d",a,b,c);?}
說明:
只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量。如:?????a=sum;?b=mon;?是正確的。而:?????a=0;?b=1;
是錯誤的。如一定要把數(shù)值賦予枚舉變量,則必須用強(qiáng)制類型轉(zhuǎn)換。?如:
a=(enum?weekday)2;
其意義是將順序號為2的枚舉元素賦予枚舉變量a,相當(dāng)于:
a=tue;
還應(yīng)該說明的是枚舉元素不是字符常量也不是字符串常量,使用時不要加單、雙引號。
【例】?
main(){ ??
enum?body?{?a,b,c,d?}?month[31],j;??
int?i;?
j=a;?
for(i=1;i<=30;i++){
month[i]=j;?
j++;?
if?(j>d)?j=a;????
}
for(i=1;i<=30;i++){
switch(month[i])?
{?
case?a:printf("?%2d??%c\t",i,'a');?break;
case?b:printf("?%2d??%c\t",i,'b');?break;?
case?c:printf("?%2d??%c\t",i,'c');?break;???
case?d:printf("?%2d??%c\t",i,'d');?break;????
default:break;???
????}??
}?
????printf("\n");?
}

聯(lián)合(union):
一、聯(lián)合說明和聯(lián)合變量定義?
聯(lián)合也是一種新的數(shù)據(jù)類型, 它是一種特殊形式的變量。
聯(lián)合說明和聯(lián)合變量定義與結(jié)構(gòu)十分相似。其形式為:
union 聯(lián)合名
{?
數(shù)據(jù)類型 成員名;?
數(shù)據(jù)類型 成員名;?
...?
}聯(lián)合變量名;?
聯(lián)合表示幾個變量公用一個內(nèi)存位置,在不同的時間保存不同的數(shù)據(jù)類型和不同長度的變量。?
下例表示說明一個聯(lián)合a_bc:?
union a_bc
{?
int i;?
char mm;?
};?
再用已說明的聯(lián)合可定義聯(lián)合變量。
例如用上面說明的聯(lián)合定義一個名為lgc的聯(lián)合變量,可寫成:
union a_bc lgc;?
在聯(lián)合變量lgc中, 整型量i和字符mm公用同一內(nèi)存位置。
當(dāng)一個聯(lián)合被說明時, 編譯程序自動地產(chǎn)生一個變量,其長度為聯(lián)合中最大的變量長度。?
聯(lián)合訪問其成員的方法與結(jié)構(gòu)相同。同樣聯(lián)合變量也可以定義成數(shù)組或指針,但定義為指針時,也要用->符號, 此時聯(lián)合訪問成員可表示成:
聯(lián)合名->成員名?
另外, 聯(lián)合既可以出現(xiàn)在結(jié)構(gòu)內(nèi), 它的成員也可以是結(jié)構(gòu)。
例如:?
struct
{?
int age;?
char *addr;?
union
{?
int i;?
char *ch;?
}x;?
}y[10];?
若要訪問結(jié)構(gòu)變量y[1]中聯(lián)合x的成員i, 可以寫成:
y[1].x.i;?
若要訪問結(jié)構(gòu)變量y[2]中聯(lián)合x的字符串指針ch的第一個字符可寫成:
*y[2].x.ch;?
若寫成y[2].x.*ch;是錯誤的。
希望對你有幫助!

學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
