C語言中枚舉與聯(lián)合體的使用方法(enum union)
enum的定義
枚舉顧名思義就是一一列舉,把可能的取值一一列舉。
枚舉的使用方式
//定義一個(gè)枚舉Color的類型 enum Color // enum Color 是一個(gè)類型 { RED, //逗號結(jié)尾 GREEN, BLUE // 最后一個(gè)成員沒有逗號沒有分號 }; int main() { printf("%d",RED);//0 printf("%d",GREEN);//1 printf("%d",BLUE);//2 return 0; }
{}中的內(nèi)容是枚舉類型的可能取值,也叫 枚舉常量 。 這些可能取值都是有值的,默認(rèn)從0開始,一次遞增1,當(dāng)然在定義的時(shí)候也可以賦初值。從賦值的地方開始,后面的枚舉常量沒賦值的話,也是從最后一次枚舉常量賦值的地方賦值地方開始依次遞增1數(shù)值
enum Color//顏色 { RED=1, GREEN=2, BLUE=4 }; int main() { printf("%d",RED);//1 printf("%d",GREEN);//2 printf("%d",BLUE);//4 return 0; }
或者這樣
enum Color//顏色 { RED=10, GREEN, BLUE }; int main() { printf("%d",RED);//10 printf("%d",GREEN);//11 printf("%d",BLUE);//12 return 0; }
當(dāng)然枚舉是類型還可以定義變量:
這個(gè)變量可以賦值枚舉常量的可能取值
enum Color//顏色 { RED=10, GREEN, BLUE }; int main() { enum Color c = RED; //定義枚舉變量,給它賦值枚舉常量的可能取值RED printf("%d",c); //10 c = GREEN; printf("%d",c); //11 // 注意點(diǎn),枚舉常量是常量,所以不可以在使用過程中修改他的值 //RED = 3; //是錯(cuò)誤的 return 0; }
enum對比#define宏常量的好處
枚舉的優(yōu)點(diǎn):
- 增加代碼的可讀性和可維護(hù)性;
- 和#define定義的標(biāo)識符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn);
- 防止了命名污染(封裝);
- 便于調(diào)試;
- 使用方便,一次可以定義多個(gè)常量。
union的定義
union 是共用體,它的意思就是union 里面成員變量的集合是公用內(nèi)存空間的。
比如
//聯(lián)合類型的聲明 union Un { char c; int i; }; //聯(lián)合變量的定義 union Un un; //計(jì)算連個(gè)變量的大小 printf("%d\n", sizeof(un)); //結(jié)果為4
成員變量 c占用一個(gè)字節(jié),成員變量i占用4個(gè)字節(jié),但是又一個(gè)字節(jié)和成員變量重疊了,這就是共用體
聯(lián)合體大小的計(jì)算
聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個(gè)聯(lián)合變量的大小,至少是最大成員的大小
當(dāng)最大成員大小不是最大對齊數(shù)的整數(shù)倍的時(shí)候,就要對齊到最大對齊數(shù)的整數(shù)倍。
union Un1 { char c[5]; int i; }; union Un2 { short c[7]; int i; }; //下面輸出的結(jié)果是什么? printf("%d\n", sizeof(union Un1)); //結(jié)果為8 printf("%d\n", sizeof(union Un2));//結(jié)果為16
分析:
- 對于Un1,我們知道Un1的最大對齊數(shù)是4,假如沒有按對齊數(shù)的話,其大小為5,有對齊數(shù),就變?yōu)?;
- 對于Un2,我們知道Un2的最大對齊數(shù)是4,假如沒有對齊數(shù)的話,其大小為14,有對齊數(shù),就變?yōu)?6;
聯(lián)合體配合算大小端的問題
記得之前用類型轉(zhuǎn)化的方式計(jì)算得到計(jì)算機(jī)是大小端,現(xiàn)在我們可以用聯(lián)合體也得到計(jì)算機(jī)的大小端;
類型轉(zhuǎn)化得到大小端的方式
int check() { int a = 1; // 0x 00 00 00 01 //低地址 ----------------------->高地址 //小端:01 00 00 00 //大端:00 00 00 01 return *(char*)&a; } int main() { int ret = check(); if(ret == 1) printf("小端模式"); else printf("大端模式"); return 0; }
聯(lián)合體的方式
union Un { char c; int i; }; int cheak() { u.i = 1; //低地址 ----------------------->高地址 //小端:01 00 00 00 //大端:00 00 00 01 //如果是小端,返回1,不是返回0 return u.c; } int main() { int ret = check(); if(ret == 1) printf("小端模式"); else printf("大端模式"); return 0; }
總結(jié)
到此這篇關(guān)于C語言中枚舉與聯(lián)合體使用的文章就介紹到這了,更多相關(guān)C語言枚舉與聯(lián)合體用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言編程中的聯(lián)合體union入門學(xué)習(xí)教程
- C語言中聯(lián)合體union的實(shí)例詳解
- C語言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解
- C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
- C語言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用
- C語言枚舉與聯(lián)合體深入詳解
- C語言中聯(lián)合體與共用體和枚舉使用語法示例
- c語言中聯(lián)合體和枚舉用法詳解
- C語言聯(lián)合體類型的實(shí)現(xiàn)
- 一文帶你認(rèn)識C語言的聯(lián)合體和枚舉
- C語言聯(lián)合體的實(shí)現(xiàn)示例
相關(guān)文章
C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解
消息隊(duì)列在多線程的場景有時(shí)會用到,尤其是線程通信跨線程調(diào)用的時(shí)候,就可以使用消息隊(duì)列進(jìn)行通信。本文將利用C++實(shí)現(xiàn)一個(gè)簡單的消息隊(duì)列,感興趣的可以了解一下2022-12-12C語言編程技巧 關(guān)于const和#define的區(qū)別心得
盡量用const和inline而不用#define 這個(gè)條款最好稱為:“盡量用編譯器而不用預(yù)處理”,因?yàn)?define經(jīng)常被認(rèn)為好象不是語言本身的一部分。這是問題之一。再看下面的語句:2013-02-02C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序
這篇文章主要為大家詳細(xì)介紹了C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06C語言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解的相關(guān)資料,數(shù)據(jù)結(jié)構(gòu)中的二叉樹查找,紅黑樹的講解,需要的朋友可以參考下2017-07-07