日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C語言枚舉類型

作者:歐橘貓 更新時間: 2022-07-18 編程語言

枚舉

枚舉是C語言中的基本數(shù)據(jù)類型,就是能把可能的取值一 一舉例
比如:性別、星期、月份 這些情況下就可以使用枚舉類型

枚舉類型的定義

枚舉類型的語法形式:

enum 枚舉名稱
{
  枚舉元素1;
  枚舉元素2;
  ......
};

枚舉類型的定義:

//用枚舉舉例星期
enum Day//枚舉的名稱
{
    Mon,
    Tues,
    Wed,     // 枚舉星期的所有可能
    Thur,
    Fri,
    Sat,
    Sun
};
  • 以上定義的 enum Day 是枚舉類型。
    { }中的內(nèi)容是枚舉類型的可能取值,也叫枚舉常量。
    這些可能取值最開始都是默認(rèn)從0開始,一次遞增1

當(dāng)然在定義的時候也可以賦初值
例如:

enum Sex//性別
{
 MALE = 5,    //男
 FEMALE,  //女
 SECRET  //保密
};
  • 后面的枚舉常量是依次遞增的,也可以一個一個賦值
enum Sex//性別
{
 MALE = 5,    //男
 FEMALE = 8,  //女
 SECRET= 9  //保密
};

枚舉的優(yōu)點

  1. 代碼的簡潔性、增加代碼的可讀性和可維護性
    枚舉 enum 和 define 對標(biāo)
    如果不使用枚舉,用 #define定義來為每個可能定義一個別名
#define  MALE
#define FEMALE
#define SECRET

以枚舉的方式定義:

enum sex
{ 
    MALE;
    FEMALE;
    SECRET
};
  • 定義性別時看起來還沒什么,如果可能性比較多,比如:月份
    那代碼就比較多且臃腫,如果使用枚舉就會很簡潔,而且增加代碼的可讀性和可維護性

還有就是以枚舉類型定義具有一定的意義
可以使用到一些程序中

enum sex
{
    MALE;
    FEMALE;
    SECRET
};
int main()
{
   enum sex a; // 定義枚舉變量
   a = MALE;
   printf("%d",a);
   return 0;
}
  1. 和#define定義的標(biāo)識符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn)
  2. 防止命名污染
  3. 便于調(diào)試
  4. 使用方便,一次可以定義多個常量

枚舉的使用

enum Day//用枚舉定義星期
{
	Mon=1,         //初始化為1
	Tues,      
	Wed,
	Thur,
	Fri,
	Sat,
	Sun         
};
int main()
{ 
	printf("%d\n", Mon);
	printf("%d\n", Tues);
	printf("%d\n", Wed);
	printf("%d\n", Thur);
	printf("%d\n", Fri);
	printf("%d\n", Sat);
	printf("%d\n", Sun);
	return 0;
}

遍歷枚舉類型

在C語言中枚舉類型是被當(dāng)做 int 或者 unsigned int 類型來處理的
所以按照 C 語言規(guī)范是沒有辦法遍歷枚舉類型的。
不過在一些特殊的情況下,枚舉類型必須連續(xù)是可以實現(xiàn)有條件的遍歷。

例如:

#include <stdio.h>
enum DAY{
      MON=1,
      TUE, 
      WED, 
      THU,
      FRI,
      SAT,
      SUN
} day; 
int main()
{
    // 遍歷枚舉元素
    for (day = MON; day <= SUN; day++)
     {
        printf("枚舉元素:%d \n", day);
    }
}
return 0;

關(guān)于枚舉還有很多使用常景,需要慢慢體會

聯(lián)合體(共用體)union

聯(lián)合體也叫共用體,是一種特殊的自定義類型
union 是聯(lián)合體的關(guān)鍵字
這種類型定義的變量也包含一系列的成員,特征是這些成員共用同一塊空間(所以聯(lián)合也叫共用體)
聯(lián)合體語法形式:
書寫的格式和結(jié)構(gòu)類似

union ud
{
   int a;
   char b;
};

聯(lián)合體的體點

聯(lián)合體的特點:聯(lián)合體成員都是使用同一塊空間,每次使用空間只能選一個成員使用,不能同時使用
比如:a成員使用空間,那 b 成員就不能使用,反之b成員使用空間,那 a 成員就不能使用
例如:
下面測試聯(lián)合體的大小問題

union ud
{
   int a;
   char b;
};
int main()
{
   union ud u;
   printf("%d\n",sizeof(u));
}

測試結(jié)果:
在這里插入圖片描述

  • 結(jié)果為什么是 4 呢?
    聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個聯(lián)合變量的大小
    至少是最大成員的大小(因為聯(lián) 合至少得有能力保存最大的那個成員)

那么聯(lián)合體的成員 a 和成員 b 的地址是否是一樣的呢?

在這里插入圖片描述

  • 從圖片上可以看出大家的地址都是一樣的
  • 因為二者公用一個內(nèi)存的話,二者指針指向的位置必須是一樣的這樣才能找到相應(yīng)的空間。

判斷當(dāng)前計算機的大小端存儲

這是之前寫過的判斷大小端存儲的問題,先在我們用聯(lián)合體來判斷

int check_sys()
{
	int i = 1;
	return *(char*)&i;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
}

用聯(lián)合體來判斷大小端存儲

int check_sys()
{
	union s
	{
		int i;
		char c;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
}
  • 用聯(lián)合體創(chuàng)建二個成語,分別是 int ichar cint i 賦值為 1
    小端存儲:01 00 00 00
    大端存儲:00 00 00 01
    直接返回 u .c,因為成員u.cchar類型,讀取的是一個字節(jié)
    返回 0 是大端,返回 1 是小端

聯(lián)合大小的計算

聯(lián)合體也是存在對齊的

  • 聯(lián)合的大小至少是最大成員的大小
  • 當(dāng)最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍

例如:

union Un1
{
char c[5];
int i;
};
int main()
{ 
   printf("%d\n", sizeof(union Un1));
}

  • char c[ 5 ] 有5個元素是占5個空間,char 類型是 1 個字節(jié)
  • int i是整型,占 4 個字節(jié)
  • 它們的最大的對齊數(shù)是 4 ,而char c[5]所占的空間是5個, 5并不是4 的倍數(shù)
    那就在浪費掉 3 個空間找到 4 的整數(shù)倍,也就是 8

例題 2:

union Un2
{
short c[7];
int i;
};
int main()
{ 
   printf("%d\n", sizeof(union Un2));
}
  • short 是短整形占 2 個字節(jié),有 7 個元素,2*7 = 14 個字節(jié)
  • int i是整型,占 4 個字節(jié)
  • 它們的最大的對齊數(shù)是 4 ,而short c[7]所占的空間是14個字節(jié),14 并不是4 的倍數(shù)
    那就在浪費掉 2 個空間找到 4 的整數(shù)倍,也就是 16

原文鏈接:https://blog.csdn.net/m0_66483195/article/details/125670380

欄目分類
最近更新