C/C++之数据类型
Tips:
?1. 本人當初學習C/C++的記錄。
?2. 資源很多都是來自網上的,如有版權請及時告知!
?3. 可能會有些錯誤。如果看到,希望能指出,以此共勉!
C數據類型
ANSI C99標準中規定的數據類型如下圖所示。
說明:
- 同一行類型的語義相同,即可以相互替代。
- long float類型與double相同,故在C99標準中沒有此類型。
- 部分編譯器也提供了unsigned float和unsigned double,最好不要使用,以免影響程序的可移植性。
- int默認是signed,所以int, signed, signed int三者等價。其它unsigned的情況類似。char默認情況不確定。
C語言中數據類型的長度
??ANSI C99標準中定義了兩類(四個)類型修飾符:long/short和unsigned/signed。C99標準規定,long類型不能比變通類型短,short類型不能比普通類型長。而unsigned與signed的區別在實現上是有無符號的區別,而是使用上是取值范圍的區別,兩者表示范圍相同,但前者全是正數,后者關于0對稱。
說明:
- long/short可以修飾int,long還可以修飾double。
- unsigned/signed可以修飾int、char,不可以修飾浮點型。
- int長度是機器的字長,short int是半個字長,long int是一個或兩個字長。
- unsigned/signed長度與普通類型一樣,只是表示區間不同。
C語言中數據類型的轉換
類型轉換分為顯示和隱式兩種,前者比較簡單,這里只講后者。下面是C99標準中給出的各種類型對象的基本轉換規則:
- 枚舉常量: 轉換成int,如超出int范圍,則轉成long int等
- 浮點型:
- 如果轉成整類型,只保留整數部分,如果超出整型表示范圍,則轉換錯誤;
- 如果向上轉成double/long double,值不變;
- 如果向下轉成float/double等,如果能用float/double表示,則正常,如果超出表示范圍,則轉換錯誤,而如果在表示范圍內,但精度降低,則要依賴于編譯器的處理了
整型: short int/char/枚舉類型/位類型都可轉換成int,如果超出int表示范圍,則提升到unsigned int。
對于二元運算符中的普通算術運算轉換,C99標準給出了如下圖所示的轉換規則:
說明:對于unsigned char和unsigned short int的整型提升問題,C99標準給出“保值”的轉換方法:方法是將unsigned char和unsigned short int轉換成int,如果超出表示范圍,則轉成unsigned int。
- 對于表格中第五行,long int與unsigned int的情況,在vc6.0沒有這樣實現,是直接轉成unsigned int。
C++數據類型
??面向對象編程(OOP)的本質是設計并擴展自己的數據類型。C++兼容C的數據類型,又稍有區別。當然,下面的數據類型說明多數同樣適用于C類型,部分不同于C的地方將單獨指出。
基本類型
??基本類型主要就是整型和浮點型,同時對這兩種進行了多種變形。(C++11新增了bool類型,兼容C99)
整型
??基本整型包括:char、short、int、long和C++11中新增的long long(兼容C99)。其中每種類型都有有符號版和無符號版。
1. 每種數據類型都有一定的數據范圍,不同的系統可能有不能的范圍。C++采用靈活的標準,確保了數據類型的最小長度(C語言可能不同):
- short 至少16位
- int 至少與short一樣長
- long 至少32位,且至少與int一樣長
- long long 至少64位,且至少與long一樣長
在頭文件climits(舊limits.h)中包含了關于整型限制的信息。如下圖(VS2010):
數據類型的范圍是怎么算出來的。(C及C++) - 計算機中數據都是以二進制存儲;
- 二進制可以由不同的編碼(原碼、補碼、反碼)表示,計算機統一采用補碼表示。
- 計算機中的正負號,0表示正數,1表示負數
以2字節(16位)有符號類型來說:
范圍: (10進制)-32768到32767;(16進制)8000到7FFF;(2進制補碼)1000,0000,0000 ,0000到0111,1111,1111,1111
原碼:最高位為符號位,其余位與正常二進制表示方法一致;
原碼表示范圍:
最大為0111111111111111 = 2^15-1 = 32767
最小為1111111111111111 = -2^15-1 = -32767
+0和-0:
+0:0000000000000000
-0:1000000000000000
即正零與負零表示方法不同。也就意味著:原碼能表示的有符號數范圍是:-32767~-0和0~32767
補碼: 正數補碼與原碼相同,負數補碼需要把除符號位以外的原碼取反加1
補碼表示范圍:
最大為0111111111111111 = 2^15-1 = 32767
最小為1000000000000001 = 原碼:1111111111111111的符號不變其余取反為:1000000000000000,再加1為:1000000000000001
+0和-0:
+0:0000000000000000 // 與原碼相同
-0:0000000000000000 // 原碼:1000000000000000的符號不變其余取反為:1111111111111111,再加1為:0000000000000000(進位舍掉)
也就是正0和負0在補碼系統中的編碼是一樣的。也就是補碼會比原碼多一個編碼出來,這個編碼就是1000000000000000。因為任何一個原碼都不可能在轉成補碼時變成1000000000000000。所以,人為規定1000000000000000這個補碼編碼為-32768。所以,補碼系統中,范圍是-23768~32767。
- C++中,對于變量的賦值更加靈活,原來用于結構體和數組的賦值,現在對于單個變量也是可以的。
- C++如何確定整型常數的類型
- 對于有字符修飾的整型數字,根據字符來判斷類型。例如:123L,則為long;123uL為unsigned long。
- 對于沒有符號修飾的十進制數字,C++總是采用int、unsigned int、long、unsigned long、long long (沒有short)中能夠存儲該數的最小類型表示。
- 對于沒有符號修飾的十六進制或者八進制,則總是以對應的無符號類型表示。
浮點型
C++基本浮點型包括:float、double、long double。unsigned和signed不能修飾浮點型
C/C++對于浮點型有效位的規定:
- float至少32位
- double 至少48位,且不少于float
- long double 至少和double一樣多
注意:默認情況下,浮點常數字為double型,例如程序中直接寫1.0,其被當做double型數字。
在頭文件cfloat(舊float.h)中包含了關于浮點型限制的信息(有些系統沒有提供該文件)。如下圖:
從上表中可看到,在VS2010中,double的有效位數為15,float的有效位數為6
浮點數的存儲
??C/C++編譯器都是按照IEEE的浮點數表示法,即一種科學計數法,用符號、指數和尾數來表示,底數為2。也就是把浮點數表示為尾數乘以2的指數次方再添加上符號的形式。因為科學技術法 a×bm的形式,a介于1~10,而浮點數表示法中,a始終為1,所以在最終的表示結果中,這個1被略去。即:尾數二進制最高位的1不要
具體規格是:
| float | 1 | 8 | 23 | 32 |
| double | 1 | 11 | 52 | 64 |
下面通過例子來解釋上面的表示規格:
- 38414.4表示為double:
- 分開整數和小數部分,整數化為16進制,0x960E;小數部分為:0.4=0.5×0+0.25×1+0.125×1+……+0.5×(1 or 0)/n+……。//實際上這永遠算不完!
- 有的小數可以窮盡,有的是永遠不會窮盡的,此時只需要提取出各項的系數,即011……,這些項的和加上整數部分共53位就可以了。正如上面所言的,最高為不變的1可以省略(歸一化),最終是53-1=52位。
- 38414.4可以表示為1001011000001110.0110011001100110011001100110011001100B。
- 用科學計數法表示為1.0010110000011100110011001100110011001100110011001100×215。
- 然后計算階碼,階碼共11位,可以表示-1024~1023,因為指數可以為負數,規定先加上1023變為非負數(指數偏移),上面的15表示為15+1023=1038,二進制為10000001110。符號位,0為正,1為負。所以最終結果是
- 0 10000001110 0010110000011100110011001100110011001100110011001100
- 顏色與上表對應。
- 3490593表示為float:
- 3490593的浮點數為3490593.0。
- 整數化為二進制,為1101010100001100100001B,即1.101010100001100100001×221,由于float的尾數有23位,需要補0。即1.10101010000110010000100×221。
- 計算階碼時,類似double的表示,階碼共8位,表示的范圍是-128~127,為了方便,加上127,上面的21表示為21+127=148=10010100B。最終結果是:
- 0 10010100 10101010000110010000100
- 顏色與上表對應。
- 0.5的二進制表示:
- 上面給出了0.4的二進制表示的計算方法:
- 0.4 = 0.5×0+0.25×1+0.125×1+……+0.5×(1 or 0)/n+……。
- 它是無窮盡的,直到精度合適了為止。
- 然而對于有的數來說,是有窮的,比如0.5=1×0.5。整數部分為0,小數部分為0.1,所以0.5的二進制形式是0.1,即1.0 × 2-1。
- 計算階碼時,用127+(-1)=126=b1111110B。所以最終結果是:
- 0 01111110 00000000000000000000000
- 顏色與上表對應。
- -12.5的二進制浮點表示:
- 整數部分為12,即1100B;小數部分為0.5,即0.1B,即1100.10000000000000000000,即1.10010000000000000000000 × 23。
- 計算階碼,3+127=130,即10000010B,所以最終結果是:
- 1 10000010 10010000000000000000000
- 顏色與上表對應。
- 逆向求取,1011 1101 0100 0000 0000 0000 0000 0000轉為十進制:
- 1011 1101 0100 0000 0000 0000 0000 0000為:
- 1 01111010 10000000000000000000000
- 所以該數為-1.10000000000000000000000 × 201111010-127=-5 = -0.000011B = 0.046875
詳細見http://blog.163.com/yql_bl/blog/static/847851692008112013117685/
有了以上知識,那么printf(“%f”,10/3);的結果是什么?結果是0.0000
10/3的結果無疑應該是3,但是,我們卻要求printf按照浮點數來去這個數,通過以上我們知道,整數和浮點數的存儲方式是不一樣的。
整型數3在內存存儲如下:
0000 0000 0000 0000 0000 0000 0000 0011
但是現在我們要用浮點數的方式來解析這32位數字。按照浮點數方式:
0000 0000 0000 0000 0000 0000 0000 0011
上面紅色是符號為0,表示正數;藍色的是指數位,結果為0,但是這兒要注意的一點是指數在存儲的時候是進行過偏移的,所以這兒要剪掉127,所以指數為-127。最后的紫色是尾數,結果是2^(-22)+2^(-23),但是也要注意一點是,尾數在進行存儲的時候是歸一化過的,小數點前面其實有個1,所以最后尾數是1+2^(-22)+2^(-23)。所以最后的浮點數是:[1+2^(-22)+2^(-23)]*2^(-127)轉化為可讀數字就是5.87747385606e-39 ,這個數就非常小了,所以顯示的時候就是0.000000啦。
數據類型轉換
隱式類型轉換
在某些情況下,C++將自動對數據類型進行轉換:
- 不同數據類型之間的賦值 例如:int a = 1.0;目標類型是被賦值對象的類型。
- 算數表達式中存在不同數據類型的數運算,例如int a = 1;double b = 2.0; int c = a+b;
- 將一個表達式作為實參傳遞給函數調用,此時形參和實參類型不一致:目標轉換類型為形參的類型
- 從一個函數返回一個表達式,表達式類型與返回類型不一致:目標轉換類型為函數的返回類型
C++11表達中,不同數據進行運算時的校驗規則(與C語言稍有區別): - 如果其中有一個數為long double,那么另一個就被轉換為long double
- 否則,如果有一個數double,那么另一個就被轉換為double
- 否則,如果有一個數為float,那么另一個數就被轉換為float
- 否則,否則說明操作數都是整型,執行整型提升
- 如果兩個操作數同是有符號或同是無符號,這轉換為等級較高的類型進行運算
- 如果一個有符號一個無符號,且無符號類型級別高,這轉換無符號數運算
- 否則,如果有符號可以表示所有無符號取值,這轉換為有符號類型運算
- 否則,將兩個數都轉換為有符號數的無符號版本運算
顯示類型轉換
(typename)value; // C語言風格 typename(value); // C++風格此外,C++還提供了四個關鍵字來實現轉換,與傳統強制轉換相比,其轉換更加嚴格
static_cast <type-id> (expression); //該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。 dynamic_cast <type-id> (expression); //該運算符把expression轉換成type-id類型的對象。Type-id必須是類的指針、類的引用或者void *;如果type-id是類指針類型,那么expression也必須是一個指針,如果type-id是一個引用,那么expression也必須是一個引用。 reinpreter_cast <type-id> (expression); // type-id必須是一個指針、引用、算術類型、函數指針或者成員指針。它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值) const_cast<type_id> (expression); // 用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。顯示對浮點數進行強制轉換時,規則如下:
| 浮點型轉整型 | 小數被省略,如果超出float范圍,結果不確定 |
| 較大整型轉較小整型,例如long轉int | 如果超出int范圍,通常只復制右邊的值 |
潛在的數據轉換問題
復合類型
復合數據類型由基本數據類型組成,C++中類就是一種符合數據類型。此外數組、字符串、結構體、共同體、枚舉、指針和自由存儲空間都作為復合數據類型
數組(C/C++)
如果只對數組部分賦值,后面的默認為零。
不能將一個數組賦值給另一個數組。
指針和二維數組(C/C++)
指針
首先,指針也是一個變量,其在內存中一般占用4個字節。比較特殊的是,指針變量中存放的值是一個地址。例如:
int *p;
這里,定義了一個指針,編譯器在內存中拿出4個字節,名字叫p,里面存放一個4字節的地址。對于未初始化的指針,其值是隨機的,很危險!
常見的指針操作:*與++、–
指針和引用的聯系與區別(僅C++)
(1)指針是一個實體,而引用僅是個別名;
(2)引用使用時無需解引用(*),指針需要解引用;
(3)引用只能在定義時被初始化一次,之后不可變;指針可變;
(4)引用沒有 const,指針有 const;
(5)引用不能為空,指針可以為空;
(6)“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
(7)指針和引用的自增(++)運算意義不一樣;
(8)從內存分配上看:程序為指針變量分配內存區域,而引用不需要分配內存區域。
在說明指針的時候,有必要額外說明一下二維數組。
以上的輸出結果為:0 0 1 1
二維數組
??有很多地方說數組就是指針,這是錯誤的一種說法。這兩者是不同的數據結構。其實,在C/C++中沒有所謂的二維數組,書面表達就是數組的數組。為了表述方便才叫它二維數組。二維數組在概念上是二維的,即其下標在兩個方向上變化,下標變量在數組中的位置也處于一個平面之中,而不是像一維數組只是一個向量。但是,實際的硬件存儲器卻是連續編址的,也就是說存儲器單元是按一維線性排列的。如何在一維存儲器中存放二維數組,可有兩種方式:一種是按行排放, 即放完一行之后順次放入第二行。另一種是按列排放, 即放完一列之后再順次放入第二列。
??在C語言中,二維數組是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[n]行。每行中的元素也是依次存放。例如對數組a[5][3]賦值兩種方式(結果完全相同):
- 按行分段賦值可寫為:
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} }; - 按行連續賦值可寫為:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
注意:
- 可以只對部分元素賦初值,未賦初值的元素自動取0值。
- 如果對全部元素賦初值,則第一維的長度可以不給出,例如:int a[][3]={1,2,3,4,5,6,7,8,9};
二維數組一維化
??我們可以用一個指向int型的指針變量來訪問這個數組,下面的代碼是將數組一維化(以上面的a數組為例):
int *p = a[0]; // 這樣就可以用 p 訪問每個元素了 p[3] // 第三個元素 *(p+3) // 這個 = p[3]這樣就實現了將二維數組一維化,通過p訪問的是每個元素,而不是行
數組指針和指針數組
指針數組: 指針數組就是個數組,只不過元素是指針。定義方式如:int *p[3]; 表示三個指針,分別為:p[0]、p[1]、p[2]
數組指針: 指向數組的指針。定義方式如:int (*p)[3]; 表示 p指向的是一個數組元素為int類型并且數組元素的個數為3的一個指針。
上例中,pArr是個數組指針,每次+1是移動一行,不是一個元素。比如說,pArr+1代表的現在指針已經指向第一行元素了(0行開始),而要取得指針所指的對象,就要用到解引用運算符,所以(pArr+1)就代表第一行數組,是整個這一行元素就取到了,那現在要取這一行的第二個元素,只須將指針再移動兩個元素,即*(iArr+1) + 2,這樣就指向了這個元素的地址,再解引用取得元素的值即可。
也許我們應該這樣來數組指針:
int (*)[10] p2;
int (*)[10]是指針類型,p2 是指針變量。這樣看起來的確不錯,不過就是樣子有些別扭。其實數組指針的原型確實就是這樣子的,只不過為了方便與好看把指針變量p2 前移了而已。
既然這樣,那問題就來了?,F在再來看看下面的代碼:
上面對p3 和p4 的使用,哪個正確呢?p3+1 的值會是什么?p4+1 的值又會是什么?
毫無疑問,p3 和p4 都是數組指針,指向的是整個數組。&a 是整個數組的首地址,a是數組首元素的首地址,其值相同但意義不同。在C 語言里,賦值符號“=”號兩邊的數據類型必須是相同的,如果不同需要顯示或隱式的類型轉換。p3 這個定義的“=”號兩邊的數據類型完全一致,而p4 這個定義的“=”號兩邊的數據類型就不一致了。左邊的類型是指向整個數組的指針,右邊的數據類型是指向單個字符的指針。在Visual C++6.0 上給出如下警告:
warning C4047: 'initializing' : 'char (*)[5]' differs in levels of indirection from 'char *'。
還好,這里雖然給出了警告,但由于&a 和a 的值一樣,而變量作為右值時編譯器只是取變量的值,所以運行并沒有什么問題。不過我仍然警告你別這么用。
但是如果修改一下代碼,把數組大小改小點,會有什么問題?p3+1 和p4+1 的值又是多少呢?
或把數組大小改大點:
int main() {char a[5]={'A','B','C','D'};char (*p3)[10] = &a;char (*p4)[10] = a;return 0; }測試結果:把數組大小改變,都會編譯不通過。
地址的強制轉換
以下,以x86 Windows為例
#include <stdio.h> int main() {int a[4]={1,2,3,4};int *ptr1=(int *)(&a+1);int *ptr2=(int *)((int)a+1);printf("%x,%x",ptr1[-1],*ptr2);return 0; }下面分析上面的數據結果
ptr1: a為數組名,那么&a+1不是增一個int,而是(int*)(a的地址+sizeof(a)),因此ptr1指向了數組結尾的第一個字節。
可以這樣理解:不管是增1還是減1,這里的1都是sizeof(類型),上面對a取地址,可認為此時類型為int a[4],這里增的是sizeof(a)
ptr2: 任何數值一旦被強制轉換,其類型就改變了。這里實際上就是將地址a,轉換為了數,然后+1,把轉換后的數再次轉換為地址。如下圖:
字符串
C++有兩種風格的字符串,一種是C語言風格的,一種是C++語言風格string。
C語言風格字符串
C語言風格的字符串以空字符結尾,空字符被寫作\0,ASCII碼為0。C不會檢查字符串長度是否越界。
對于C風格的字符串操作一般通過庫函數來實現,在頭文件string.h中(C++ cstring)包換大量字符串操作的函數。
要保證目的字符串可以容納原字符串,否則,編譯不會出錯,但是運行時,會出現錯誤:Stack around the variable ‘xxx’ was corrupted.
C++字符串 String
IOS/ANSI C++98標準添加了String類,使用者可以直接將它作為一種數據類型來用,定義字符串變量(對象)。要使用String類必須包含頭文件string,而且string位于std命名空間中。
詳細的使用方法見文件: 雙擊圖標查看!
結構體
無論在C還是C++中,結構體都是很常用的一種數據類型。結構體名,用作結構體類型的標志,它又稱結構體標記。大括號內是該結構體中的成員列表,又稱為域表。
結構體的內存對齊
結構體內存分配的原則:編譯器按照成員列表順序一個接一個地給每個成員分配內存。只有當存儲成員需要滿足正確的邊界對齊要求時,成員之間才可能出現用于填充的額外內存空間。如果不按照平臺要求對數據存放進行對齊,會帶來存取效率上的損失。此外,合理利用字節對齊還可以有效地節省存儲空間。但要注意,在32位機中使用1字節或2字節對齊,反而會降低變量訪問速度。因此需要考慮處理器類型。還應考慮編譯器的類型。在VC/C++和GNU GCC中都是默認是4字節對齊。
結構體字節對齊的細節和具體編譯器實現相關,但一般而言滿足三個準則:
1) 結構體變量的首地址能夠被其最寬基本類型成員的大小所整除;
2) 結構體每個成員相對結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充字節(internal adding);
3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之后加上填充字節{trailing padding}。
位域(位段)
有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。定義方式如下:
struct 位域結構名 { 類型說明符 位域名:位域長度 }; 例: struct bs {int a:8; // 8個二進制位int b:2; // 2個二進制位int c:6; // 6個二進制位 };位域需要遵循以下規則:
1. 位域的長度不能大于數據類型本身的長度,比如int類型就能超過32位二進位。有其他人說是不能超過8位,我在我的機子上是可以實現int :32的位域長度的。
2. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的
3. 如果相鄰位域字段的類型相同,且其位寬之和小于類型的sizeof大小,則后面的字段將緊鄰前一個字段存儲,直到不能容納為止;
4. 如果相鄰位域字段的類型相同,但其位寬之和大于類型的sizeof大小,則后面的字段將從新的存儲單元開始,其偏移量為其類型大小的整數倍;
5. 如果相鄰的位域字段的類型不同,則各編譯器的具體實現有差異,VC6采取不壓縮方式(不同位域字段存放在不同的位域類型字節中),Dev-C++和GCC都采取壓縮方式;
6. 如果位域字段之間穿插著非位域字段,則不進行壓縮
7. 整個結構體的總大小為最寬基本類型成員大小的整數倍
8. C99規定int、unsigned int和bool可以作為位域類型
系統會先為結構體成員按照對齊方式分配空間和填塞(padding),然后對變量進行位域操作。
舉例如下:
#include <iostream> #include <memory.h>using namespace std; struct A {int a:5;int b:3; }; int main(void) {char str[100] = "0134324324afsadfsdlfjlsdjfl";struct A d;memcpy(&d, str, sizeof(A));cout << d.a << endl;cout << d.b << endl;return 0; }如上代碼,執行結果如下:
分析:
高位 00110100 00110011 00110001 00110000 低位
‘4’ ‘3’ ‘1’ ‘0’ // 以上二進制位字符的ASCII碼
其中d.a和d.b共同占用低位一個字節(00110000), d.a : 10000, d.b : 001
然后,int 是有符號的。所以d.a對應的數為11111111 11111111 11111111 11110000;d.b對應的二進制為10000000 00000000 00000000 00000001
同理,如果int a:5改為了int a:16,此時,d.a對應的值就是10000000 00000000 00110001 00110000
共同體(聯合體)
共同體是一種數據格式,它能夠存儲不同的數據類型,但同時只能存儲一種。
匿名共同體:定義時,直接省去共同體的名稱,但這里一般同時定義一個對象,因為沒有名字以后就沒法定義了!除非是放在其他結構里面,可以不定義對象。
關于共同體的嵌套
注:結構體與聯合體有何區別?
枚舉
1、枚舉值默認從零開始,后面的比前面的增加1
2、C早期版本規定,枚舉賦值必須是int型,現在該限制被取消了,賦值可以是long、long long
3、可以定義具有相同值的枚舉值
在C++98中enum變量的實際大小由編譯器決定,只要能夠保存enum的成員即可,而在將要發布的新的C++0x中,可以指定enum的實際實現類型,如實現為int類型。
enum Month:int{ Jan, Feb, …, Dec }
其他類型:自由存儲
單獨說明
總結
以上是生活随笔為你收集整理的C/C++之数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++ 之 C发展史及 各标准特性说
- 下一篇: C/C++之常用关键字