C 之列舉型別探索

2021-07-08 12:46:44 字數 1532 閱讀 4693

一、enum初識(作用)

enum的全稱是enumeration意思是列舉,可以用一些符號表示一組屬性值,也就是將數字符號化,因為數字表面看不出任何意義,可讀性很差。

例如,在貪吃蛇遊戲中表示地圖資訊 enum mapinfo ;

相比於直接用0,1,2對地圖賦值可讀性強很多。

但是說到符號化數字,可以使用

#define

巨集來達到相同目的,但是巨集只是在編譯階段進行簡單的替換,編譯器不進行型別檢查而且在程式中大量使用巨集也會使程式變得繁瑣。而enum型別在替換時會進行型別檢查,降低了程式出錯的可能性。

二、列舉型別用法

1、列舉成員的值

預設第乙個成員為0,以後依次+1

可以指定成員的值,以後的成員如果不指定,為上乙個成員值+1

2、對列舉變數賦值

enum mapinfo ;

mapinfo info = mapinfo::ground ;

當然也可以直接info = ground ;

3、限制賦值範圍

對乙個列舉變數賦值,如果直接使用整形常量,編譯器不允許,可以達到限制賦值範圍作用。

但是!仍然可以通過型別強制轉化,將整形常量轉化為列舉型別來進行賦值,只一點破壞了此作用。

4、int與列舉型別

int可以接受任何列舉型別成員和列舉變數的賦值

列舉型別變數正常情況下不能接受整形變數賦值。

三、列舉型別和常量

c++中的常量,例如 const int a =5 ;在之後將a做為右值對某變數賦值時,編譯器其實是將a出現的地方替換為5.列舉型別也是如此,將列舉型別中的成員做為乙個常量,在編譯階段進行替換,所以此時不分配記憶體空間,這點可以檢視彙編**。

例如:enum test ;

int test = a ;

test test2 = a ;

在編譯時:

int test = 0 ;

test test2 = 0 ;

但是在定義乙個列舉型別的變數時,仍會分配記憶體空間。

但是列舉型別變數的大小是多少呢?

四、列舉型別變數的大小?

使用sizeof關鍵字,發現大小為4位元組,等效於int型,那是不是列舉型別就是int型呢?

1、  為何大小是4位元組?

c++標準規定的是,列舉型別的大小必須能容納最大的成員,而且不能超過int型大小

也就是說不一定是4位元組,如果成員1個位元組就能容下,那它就是1個位元組,但是測試後發現為什麼還是4位元組?因為這涉及到編譯器對程式的優化和某些cpu對對齊的4位元組計算有更高的效率等等原因,所以通常就直接算4位元組。

新的c++標準可以宣告占用位元組

enum test : char ;

此列舉型別佔1位元組

2、  等效於int型?

使用新版的vs,對列舉型別變數直接賦值其他整形常量,發現編譯錯誤,提示說「無法從int型轉換為***(列舉型別名)型」所以說列舉型別和int型還是不同的,編譯器區別對待!

C 之列舉型別與列舉類

enumtype.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std 定義乙個列舉型別,可以通過這個定義相應的列舉成員的識別符號 並用其中的乙個為他們賦值 定義在main函式體外屬於全域性變數 enum gameresult ...

C 之列舉型別enum

某些資料只有有限的幾種可能值,雖然可以用int char等型別來表示它們,但是對資料的合法性檢查卻是一件很麻煩的事。比如,如果用整數0 6代表一星期的7天,那麼變數8便是不合法的資料。列舉就是專門用來解決這種問題的。將需要的變數值一一列出來,便構成了乙個列舉型別。宣告形式 enum 列舉型別名 例如...

C 之列舉型別總結

一 enum位域 flags flags public enum week flags public enum week 1.在列舉定義加上關鍵字 flags 表示這個是位列舉 2.表示兩邊是否其中乙個是另外乙個的子集,如果是返回子集,否則返回0 如果其中乙個包含另外乙個,返回被包含的,否則返回0 ...