枚舉顧名思義就是:列舉?。? ?即把可能的取值一一列舉出來。
比如我們現實生活中:
- 一周當中從周一至周日的7天,可以一一列舉;
- 性別有:男、女、保密,可以一一列舉;
- 月份有12個月,可以一一列舉;
- 顏色有赤橙黃綠親藍紫等,可以一一列舉;
- ......
這里我們直接上代碼:
//枚舉類型#include enum Sex//性別{ //枚舉的可能取值-常量 MALE = 2, FEMALE = 4, SECRET = 8 //以上為給常量賦一個初始值};enum Day//星期{ Mon, Tues, Wed, Thur, Fri, Sat, sun};enum Color//顏色--三原色 RGB{ RED,//0 GREEN,//1 BLUE//2};int main(){ printf("%d %d %d/n", RED, GREEN, BLUE); printf("%d %d %d/n", MALE, FEMALE, SECRET); return 0;}
執行結果:
以上定義的 enum Day , enum Sex , enum Color 都是枚舉類型。 { } 中的內容是枚舉類型的可能取值,也叫 枚舉常量 。
這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值,這些值叫做枚舉常量。
上文代碼中 enum Sex 枚舉類型中的值就為枚舉常量,其中的常量值為2,4,8。
我們可以使用#define定義常量,為什么非要使用枚舉呢??
#include #define RED 0#define GREEN 1#define BLUE 2int main(){ int color = RED; return 0;}
1.增加代碼的可讀性和可維護性
2.和#define定義的標識符比較枚舉有類型檢查,而#define定義的標識符是無類型的,所以更加的嚴謹。
3.防止了命名污染(封裝)
4.便于調試
5.使用方便,一次可以定義多個常量
enum的大小該如何去求呢?
例:
#include enum Sex{ MALE, FEMALE, SECRET};int main(){ enum Sex s = MALE; printf("%d/n", sizeof(s)); return 0;}
執行結果:
?思考:為什么這里的結果為4呢?
分析:
首先這里 MALE 實際意義上是一個整數,因為他的枚舉常量值默認為 0,而 0 是一個整數,這里不管賦值給?FEMALE、SECRET?,他們的枚舉常量值1、2都是一個整數,那么此時s就是一個整形類型的變量值,所以 enum 的值為4。
enum Color//顏色{ RED=1, GREEN=2, BLUE=4 }; int main(){ enum Color clr = GREEN;//只能拿枚舉常量給枚舉變量賦值,才不會出現類型的差異。 clr = 5; return 0;}
?思考:clr = 5可行嗎??
解答:NO!?
原因:
枚舉常量和常量值是有區別的,將常量直接賦值給枚舉常量類型,編譯器會報錯或警告?
注:枚舉類型的常量如果中間某個值被自定義賦值,那么其前面的值仍然從0開始遞增,其后面的值按照自定義的值遞增。
總結:枚舉是一種類型,可以用來定義變量(枚舉變量),但是其成員是常量值(枚舉常量)
聯合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間。(所以聯合也叫共用體)
例:
//聯合-聯合體-共用體#include union Un //共用體類型的聲明{ char c;//1 int i;//4};//5個字節int main(){ union Un u; printf("%d/n", sizeof(u)); printf("%d/n", sizeof(u.c)); printf("%d/n", sizeof(u.i)); printf("%p/n", &u); printf("%p/n", &(u.c)); printf("%p/n", &(u.i)); return 0;}
執行結果:
分析:?
當然此處第一塊空間并不是 u.i 和 u.c 各占一半空間,而是共用了一塊空間,u.i 的地址也就和 u.c一樣了
聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為聯合至少得有能力保存最大的那個成員)
判斷當前計算機的大小端存儲
#include check_system(){ union { char c; int i; }u; u.i = 1; //返回1,表示小端 //返回0,表示大端 return u.c;}int main(){ //int a = 0x11 22 33 44; //低地址——————————————————>高地址 //...[][][][][11][22][33][44][][][][]... 大端字節序存儲模式 //...[][][][][44][33][22][11][][][][]... 小端字節序存儲模式 //討論一個數據放在內存中存放的字節順序(大小端字節序問題) int a = 1; int ret = check_system(); if(1 == ret) printf("小端/n"); else printf("大端/n"); return 0;}
如果這邊對于大小端的內容有所遺忘/不了解的可以到我的另一篇博文中再復習學習一遍哦,鏈接放在下方?!
- 共用體的大小至少是最大成員的大小。
- 當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
例:?
#include union U1{ int a;//4 char arr[5];//5union U2{ short s[7];//7 int b;//4};int main(){ union U1 u1; union U2 u2; printf("%d/n", sizeof(u1)); printf("%d/n", sizeof(u2)); return 0;}
執行結果:
分析:
u1:
數組a為整型,大小為4個字節,他的默認對齊數為8,對齊數是4
而arr是字符數組,其中有5個元素,大小為5 * 1 = 14個字節,他的默認對齊數是8,對齊數是1。
5不是最大對齊數4的倍數,所以浪費3個字節后為8個字節,而對齊到4的倍數后大小為8
u2:
數組s為短整型數組,有7個元素,大小為7 * 2 = 14個字節,他的默認對齊數是16,對齊數是14
數組b為整型,大小為4個字節,默認對齊數就是8,對齊數是4
14不是最大對齊數4的倍數,所以浪費2個字節后為16個字節,對齊到4的倍數后大小為16
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119107.html
目錄 ? ?一、數據類型介紹 二、類型的意義 三、類型的基本歸類 整型家族 浮點數家族 構造類型(自定義類型) 指針類型 空類型 四、整形在內存中的存儲 原碼、反碼、補碼 大小端字節序 為什么有大端和小端? 一道經典筆試題 ?一、數據類型介紹 數據從大的方向分為兩類: 內置類型自定義類型內置類型我們前面已經學習過,如下: char? ? ? ? ? ? //字符數據類型 short? ? ? ...
摘要:結構體類型的特殊聲明在初階結構體中,我們已經將了結構體類型是如何進行聲明的,那么在這里,我們將講一些特殊的結構體聲明不完全的聲明。所以我們應該這樣寫通過指針來找到下一個同類型結構體的寫法,我們就稱之為結構體的自引用。 ...
摘要:字符串常量適用于那些對它不做修改的字符串函數。同時,語言提供了一系列庫函數來對操作字符串,這些庫函數都包含在頭文件中。目標空間必須足夠大,以確保能存放源字符串。拷貝個字符從源字符串到目標空間。 前言: ????????字符串是一種非常重要的數據類型,但是C語言不存在顯式的字符串類型,C...
面向對象設計是一類編程方式,此編程方式的落地式需要使用類和目標來達到,因此,面向對象設計本身就是對類和目標的應用,今日給大家介紹一下python面向對象設計開發設計及本質特征,感興趣的小伙伴一起了解一下吧 序言 面向對象設計對新手而言不難理解但無法運用,盡管我們給大家匯總過面向對象戰略部署方式(定義類、創建對象、給目標發信息),可是看似簡單其實不簡單。大量程序編寫訓練與閱讀高質量的編碼有可...
摘要:導航前言功能函數結構設定菜單交互主函數通訊錄初始化新增聯系人查找聯系人刪除聯系人修改聯系人查看所有聯系人清空所有聯系人以名字排序所有聯系人結尾語前言本文將實現一個簡易的電話簿管理。信息包括名字,性別,電話號碼,年齡,住址。 ...
閱讀 1161·2021-11-16 11:45
閱讀 1015·2021-09-04 16:41
閱讀 3077·2019-08-29 16:40
閱讀 2852·2019-08-29 15:34
閱讀 2672·2019-08-29 13:11
閱讀 1734·2019-08-29 12:58
閱讀 1725·2019-08-28 18:00
閱讀 1775·2019-08-26 18:26