9 4 列舉型別

2021-09-16 14:31:44 字數 1978 閱讀 1107

乙個變數只有幾種可能的取值,可以一一枚舉出來,變數的取值僅限於列舉的值的有限範圍內,而不適宜用整型、實型、字元型直接表示,c語言提供了這種列舉資料型別。例如,一年的四季有春夏秋冬;乙個星期有星期日、星期一到星期六等。

定義列舉型別的一般形式為:

enum [列舉型別名]

;

如:

enum weekday ;
1. 列舉變數的定義

與結構體、共用體、位子段一樣,它也存在 3 種定義方式(間接、直接、無名定義)。

如:間接定義列舉變數形式:

enum weekday day;

直接定義列舉變數形式:

enum weekday day;

無名定義列舉變數形式:

enum day;

定義列舉型別變數之後,就可以為它們賦列舉元素的值。如 day = fri;

列舉型別資料使用的幾點說明:

(1)enum 是定義列舉型別的保留字,花括號內是列舉出來的列舉元素,「整型常量」為列舉元素的序號初值,常常可以省略。

(2)上面我們定義了乙個列舉型別 weekday ,它包含了 sun, mon, tue, wed, thu, fri, sat 7個列舉常量。在說明列舉型別的同時,編譯程式按順序給每個列舉元素乙個對應的序號,也就是「整型常量」,系統預設序號的值從 0 開始,後續元素順序加 1 。 也可以在定義時人為指定列舉元素的序號值,如:

enum day;

沒有指定序號值的元素則在前一元素序號值的基礎上加 1 。

(3)列舉值又稱為列舉元素列舉常量,也是使用者定義的識別符號,並不一定用 sun 就表示星期日,也可以用其他的識別符號來表示,它們只作為列舉型別變數取值的可選項並應該是有限個。同時在程式中不能對列舉元素賦值,如 sun = 4,mon = 5;是非法的語句。

(4)列舉值可以進行加(減)乙個整數 n 的運算,用以得到其後(前)第 n 個元素的值。

(5)列舉值可以按定義時的序號進行關係比較,如:if (day == mon) … 其實是根據列舉元素的序號值進行判定的。

(6)只能給列舉變數賦列舉值,若賦序號值則必須進行強制型別轉換,如:day = 2;是非法表示,應該用 day = (enum weekday)2; 表示,相當於 day = tue;

(7)列舉變數也可以做函式的引數或函式的返回值

2. 列舉變數的使用

例9.9 設某月的第一天是星期一,輸入該月的任意一天,輸出這天是星期幾。

具體程式如下:

#include "stdio.h"

void main() d[32],n;

/* 注意:此處定義的是列舉型別的 d 陣列和列舉型別的 n 變數 */

int i,j;

n = mon; /* 注意變數 n 的取值,只能取列舉值 */

for (i = 1; i < 32; i++)

printf("\n input day: ");

scanf("%d", &j);

printf("\n");

switch(d[j])

getchar();

}

執行結果:

input day: 21

21 is sunday

146 列舉型別

除了簡單的變數型別之外,c 還提供了3個複雜的變數 列舉,結構和陣列。列舉型別的定義 enum 列舉型別的宣告 列舉型別的賦值 在遊戲中我們可以定義乙個int型別來儲存狀態 0 遊戲暫停 1遊戲失敗 2遊戲勝利 3開始選單,但是這樣不容易閱讀,而且容易出錯。這個時候我們通過列舉型別來解決 enum ...

3 5 9 列舉型別

有時,變數的取值只在乙個有限的集合內。例如 銷售的服裝或服裝只有小 中 大 和超大的四種尺寸。當然,可以將這些尺寸分別編碼為1 2 3 4或s m l x。但這樣存在著一定的隱患。在變數中很可能儲存的是乙個錯誤的值 如0或m 針對這種情況,可以自定義列舉型別。列舉型別包括有限個命名的值。例如,enu...

rust筆記6 列舉型別

rust的列舉型別相對於c 來說,有更強大的表現能力,先給出最基本的定義方式 enum ip fn main 列舉型別可以有不同的資料型別,並儲存對應的資料,給出 例項 enum ip fn main 列舉型別可以有自己的impl塊,例項 enum message write string chan...