C語言系列文章之enum

2021-09-11 17:40:35 字數 1596 閱讀 4226

列舉,顧名思義,就是把乙個個可能的值列舉出來,它們占用的空間是同乙個。這個功能和 #define 有些相似,但又不完全一樣,#define 是專業替換戶,列舉可能的值只是它的其中一種運用方式罷了(關於 #define,可以檢視 define 小節)。

怎麼理解呢?就比如乙個玻璃瓶,你規定只能用它裝水、飲料、酒這三樣東西(列舉所有可能值)。當你裝了水之後,如果你想用它裝飲料的話,你就只能把水倒掉之後才能再裝飲料,否則就變味了(可能還要再清洗一下,說笑的)。同理裝酒也是一樣的道理,一次只能裝一樣東西。

還是照舊,先看它的使用:

這是最常用的列舉。現在來分析一下。

和結構體、聯合體不同,每個列舉的值後面是逗號而不是分號,這是因為它不是宣告的變數,也沒有占用多個記憶體空間,false 和 true 也不是同時擠在同乙個空間裡面,而是這個空間的值要麼是 false,要麼是 ture (注意這裡的 true 等於 0x01,而不是 0xff),不可能是其它值(使用強制轉換的話另說)。

比如說在上面的基礎上宣告乙個列舉變數 state:

對它先後進行兩次賦值之後, state 的值就是最後賦值的 true,不會說可能是 false。其實列舉變數和普通的變數沒多大區別,只是說程式設計師在對它進行賦值的時候會受到一些限制:這個變數只能是列舉的那些值,不應該是其他(強制轉換能把這列舉變數的值變成其他可能的值,比如說我可以把常數 2 強制轉為 state_t 列舉型,這樣 state 變數裡面存的值就是 2 了,關於強制轉換我會用另一小節詳細說明)。

如果你把非列舉的值賦值給這個列舉變數的話,那麼是會出現警告的:

而如果你確定這個值 0 是沒有問題的(因為 flase 就是 0 啊),那麼可以使用強制轉換(像這樣 state = (state_t) 0;),但最好不要這麼做,不然你幹嘛要用列舉呢?

這裡雖然 false 的值就是 0,但是你不能用 0 去賦值,而必須使用 false 賦值,因此我們可以利用這個特性,讓編譯器去檢查這個列舉變數的值,如果我們一時頭腦發熱將某個沒列舉的值賦值給這個列舉變數了,那麼編譯器是能檢查出來的,所以對於某些儲存具有固定可能值的變數最好使用列舉變數。另外使用列舉還有乙個好處就是,你能在除錯視窗看到這個值代表什麼:

這樣你就不用去查 0x01 代表什麼了。

現在應該大概懂了列舉變數的特點了吧,也應該知道是怎麼回事,現在往細了說。

首先,每乙個列舉值都會在前乙個基礎上遞增,如果第一枚舉值沒有指定值,那麼就是 0,如果指定是負數,後面的值也會從負數的基礎上地遞增。

並且這些值都沒有超過 255,所以編譯器給它分配的空間大小就是 1 位元組。

C語言系列文章之typedef

typedef 應該算是很熟悉的關鍵字了,但是我也只是簡單使用罷了,為了比較系統的講述這一小節,特地上網搜了一下。好了,現在正式開始講解。typedef 關鍵字可以用於給資料型別定義乙個別名,比如說你本名叫關谷神奇,我嫌棄這個名字太長了,所以給你取乙個別名,叫關谷,以後我叫關谷的時候你就知道在叫你了...

c語言列舉enum

一 列舉的概述 在程式中,可能需要為某些整數定義乙個別名,我們可以利用預處理指令 define來完成這項工作,而我們也可以利用列舉來達到這個目的 define mon 1 define tue 2 define wed 3 define thu 4 用列舉的寫法為 enum day 這就是乙個列舉型...

C 系列文章之《C 語言設計與演化》讀書筆記

一直以為自己的c 水平還可以,但是感覺只停留在理論階段,實際遇到問題時還不知所措,進而藉此機會在好好學習一下。學習理論同時以實踐為主,結合自己工作經驗將容易出錯的地方記錄下來,供以後備查。學習計畫如下 a c 語言設計和演化 b accelerated c c c 語言程式設計 d c primer...