最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C和C++11之enum枚舉的具體使用方法

 更新時間:2020年12月09日 09:18:42   作者:李春港  
這篇文章主要介紹了C和C++11之enum枚舉的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

由于C++項目中用了相對比較多的枚舉(enum),正常情況下,枚舉變量都是占用一個整形類型的大小,但是項目中枚舉(enum)只需要使用到一個字節(jié)的大小,因為是在嵌入式設(shè)備上執(zhí)行的代碼,資源比較少,那么如果枚舉都是按照int型大小來使用的話,這無疑是一種資源浪費(fèi)。

所以就想有沒有一種辦法可以控制枚舉(enum)占用內(nèi)存的辦法。所幸,通過查找資料,發(fā)現(xiàn)C++11的新特性剛好加入了控制枚舉大小的機(jī)制。那么接下來我們就來看看,枚舉(enum)在C++11標(biāo)準(zhǔn)有哪些變化?以及C和C++11中的枚舉(enum)有什么區(qū)別?

二、C中的枚舉(enum)

2.1 C中枚舉的大小

前面有說到,默認(rèn)情況下,枚舉enum的大小是一個整形類型的大小,但是整形類型有很多:int、long int、short int等,所以enum的大小還是不能確定的。在C中enum的大小是不可以通過程序員顯式控制的,這個大小是編譯器根據(jù)我們給枚舉(enum)賦值的大小來選擇合適的整數(shù)類型的。

下面舉個例子:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 測試enum的特性
** Author: lcg
** Version: 1.0
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1
{
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2
{
  GRAY = 0x1122334455,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  printf("enum color1: %d\n", sizeof(enum color1));
  printf("enum color2: %d\n", sizeof(enum color2));
  return 0;
}

輸出結(jié)果:

enum color1: 4
enum color2: 8

我們發(fā)現(xiàn)這兩個枚舉變量所占用的大小是不一樣的,enum color2已經(jīng)超過了4個字節(jié),所以編譯器會根據(jù)實際值的大小來調(diào)整枚舉變量的大小。

這就存在了一個弊端,當(dāng)我們定義的一個結(jié)構(gòu)體里面有枚舉變量的時候,當(dāng)枚舉變量值變化的時候,那么結(jié)構(gòu)體的大小就有可能會跟著變化。在沒有給枚舉賦值的時候為結(jié)構(gòu)體申請了堆空間,后面如果給枚舉賦了一個超過4個字節(jié)的值,那么這個時候結(jié)構(gòu)體的實際大小就已經(jīng)變化了,這樣我們后面程序?qū)υ摻Y(jié)構(gòu)體進(jìn)行操作時就會存在隱患。

2.2 C中枚舉的取值范圍

我們繼續(xù)使用上面的例程來說明取值范圍:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.c
** Description: 測試enum的特性
** Author: lcg
** Version: 1.1
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1
{
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2
{
  GRAY = 1,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  enum color1 myClolor1;
  
  myClolor1 = RED;
  printf("myClolor1: %d\n", myClolor1);
  
  myClolor1 = GRAY;
  printf("myClolor1: %d\n", myClolor1);
  
  myClolor1 = 10;
  printf("myClolor1: %d\n", myClolor1);
  
  return 0;
}

輸出結(jié)果:

myClolor1: 0
myClolor1: 1
myClolor1: 10

可以看到,在C下enum定義的變量可以賦規(guī)定范圍外的值的,但是在C++11下這是不允許的。在C++11中編譯會不通過,是C++11對C中enum的優(yōu)化。

三、C++11中的枚舉(enum)

3.1 c++11中新增枚舉大小的控制

在C++11中程序員就可以對枚舉(enum)進(jìn)行顯式控制其占用內(nèi)存的大小了,如下示例:

/*****************************************************************************
** Copyright © 2020 lcg. All rights reserved.
** File name: enum.cpp
** Description: 測試enum的特性
** Author: lcg
** Version: 1.2
** Date: 2020.12.08
*****************************************************************************/
 
#include <stdio.h>
 
enum color1 : char {
  RED = 0,
  GREEN,
  BLUE
};
 
enum color2 : int {
  GRAY = 1,
  YELLOW,
  PURPLE
};
 
int main(int argc, char *argv[])
{
  printf("enum color1: %d\n", sizeof(enum color1));
  printf("enum color2: %d\n", sizeof(enum color2));
  
  return 0;
}

輸出結(jié)果:

enum color1: 1
enum color2: 4

C++11這樣的特性就可以很好地解決我在前言所說的那些情況啦,可以節(jié)省資源。

3.2 c++11新增有作用域的枚舉類型

如上面2.2小節(jié)的程序如果在C++11的標(biāo)準(zhǔn)中編譯就會出現(xiàn)以下的報錯:

1.cpp:33:15: error: cannot convert ‘color2' to ‘color1' in assignment
     myClolor1 = GRAY;
               ^
1.cpp:36:15: error: invalid conversion from ‘int' to ‘color1' [-fpermissive]
     myClolor1 = 10;

在C++11標(biāo)準(zhǔn)中,enum定義的變量是不可以賦規(guī)定范圍外的值的。這樣為后期的調(diào)試帶來了很多的便利之處。

到此這篇關(guān)于C和C++11之enum枚舉的具體使用方法的文章就介紹到這了,更多相關(guān)C++11 enum枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言堆棧幀的介紹與創(chuàng)建

    C語言堆棧幀的介紹與創(chuàng)建

    這篇文章主要給大家介紹了關(guān)于C語言堆棧幀的相關(guān)資料,堆棧幀 (stack frame)( 或活動記錄 (activation Tecord)) 是一塊堆棧保留區(qū)域,用于存放被傳遞的實際參數(shù)、子程序的返回值、局部變量以及被保存的寄存器,需要的朋友可以參考下
    2021-08-08
  • 論C++的lambda是函數(shù)還是對象

    論C++的lambda是函數(shù)還是對象

    這篇文章主要介紹了論C++的lambda是函數(shù)還是對象,對于有捕獲的lambda,其等價于對象。對于沒有任何捕獲的lambda,其等價于函數(shù),下面來看看具體的相關(guān)內(nèi)容,需要的朋友可以參考一下
    2022-02-02
  • C語言實現(xiàn)循環(huán)打印星號圖形再鏤空

    C語言實現(xiàn)循環(huán)打印星號圖形再鏤空

    這篇文章主要介紹了C語言實現(xiàn)循環(huán)打印星號圖形再鏤空,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C/C++實現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換

    C/C++實現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何使用C/C++實現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • C++中函數(shù)重載與引用的操作方法

    C++中函數(shù)重載與引用的操作方法

    C++中函數(shù)重載允許同名函數(shù)根據(jù)參數(shù)列表的不同而執(zhí)行不同的功能,這依賴于名字修飾或名字改編(Name Mangling)機(jī)制,而引用則是為變量創(chuàng)建一個別名,不會開辟新的內(nèi)存空間,本文介紹了C++中函數(shù)重載與引用的操作,感興趣的朋友一起看看吧
    2024-10-10
  • C++順序表的基本操作(使用模版類)

    C++順序表的基本操作(使用模版類)

    這篇文章主要為大家詳細(xì)介紹了C++順序表的基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 使用C語言來畫出皮卡丘的教程(附代碼)

    使用C語言來畫出皮卡丘的教程(附代碼)

    在C語言中使用圖形庫畫圖需要引入graphics.h庫,我們可以通過代碼實現(xiàn)畫出一個可愛的皮卡丘,將皮卡丘的繪制分為以下部分:耳朵、臉部、眼睛、嘴巴、手臂、腿部、尾巴,下面我們就來學(xué)習(xí)如何使用C語言編寫畫皮卡丘的代碼
    2024-01-01
  • C++實現(xiàn)寵物商店信息管理系統(tǒng)

    C++實現(xiàn)寵物商店信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)寵物商店信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個數(shù)

    C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個數(shù)

    這篇文章主要介紹了C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個數(shù),兩道基礎(chǔ)的算法題目,文中也給出了解題思路,需要的朋友可以參考下
    2016-02-02
  • C++數(shù)組指針和二維數(shù)組詳情

    C++數(shù)組指針和二維數(shù)組詳情

    這篇文章主要介紹了C++數(shù)組指針和二維數(shù)組,指針數(shù)組和二維數(shù)組在應(yīng)用中常用于函數(shù)傳參,下面我們就來看看指針數(shù)組和二維數(shù)組在應(yīng)用中的具體使用吧,需要的朋友可以參考一下
    2021-10-10

最新評論

霍城县| 西乌珠穆沁旗| 黑山县| 明光市| 屏南县| 镇安县| 鄂托克前旗| 拉孜县| 庆云县| 甘肃省| 临江市| 高雄县| 南阳市| 罗田县| 扬中市| 湖北省| 英山县| 农安县| 大厂| 合川市| 原阳县| 天津市| 乌兰察布市| 遂川县| 达日县| 田阳县| 万全县| 营口市| 九江市| 武功县| 乡宁县| 红桥区| 祁连县| 雷山县| 乐东| 吉水县| 法库县| 康乐县| 奈曼旗| 张家界市| 淮南市|