網(wǎng)站首頁 編程語言 正文
枚舉
枚舉是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)點
- 代碼的簡潔性、增加代碼的可讀性和可維護性
枚舉 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;
}
- 和#define定義的標(biāo)識符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn)
- 防止命名污染
- 便于調(diào)試
- 使用方便,一次可以定義多個常量
枚舉的使用
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 i
和char c
,int i
賦值為 1
小端存儲:01 00 00 00
大端存儲:00 00 00 01
直接返回u .c
,因為成員u.c
是char
類型,讀取的是一個字節(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
相關(guān)推薦
- 2024-03-03 ElementUi中el-cascader表單驗證問題
- 2023-07-14 express+mongoose實現(xiàn)無限級分類
- 2023-01-02 GO比較兩個對象是否相同實戰(zhàn)案例_Golang
- 2022-03-29 C語言全排列回溯算法介紹_C 語言
- 2022-04-19 c#中token的使用方法實例_C#教程
- 2023-07-31 TypeError:cannot read property ‘getAttribute‘ of
- 2022-04-11 springboot上傳文件到Nginx代理的FTP文件服務(wù)器
- 2022-02-18 cv2.error: OpenCV(4.5.4-dev) :-1: error: (-5:Bad a
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支