C语言入门经典——基础知识(数据类型)(32位与64位系统基本数据类型的字节数)
一、讀取數(shù)據(jù)的格式說明符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
除此之外:?????sizeof(char) =?? 1? ? ? ? ? ? ? ? ? ??sizeof(long long) =? 8? ? ? ? ? ? ? ? ? ? ??sizeof(long? double) =? 12
????????????????????????????? sizeof(unsigned char) = 1? ? ? ? ? ? sizeof(unsigned long long) = 8
sizeof運(yùn)算符可以確定給定的類型占據(jù)的字節(jié)數(shù)。在C語言中sizeof是一個(gè)關(guān)鍵字。其結(jié)果是一個(gè)無符號的整數(shù),可以用%u說明符輸出它。其可以確定某個(gè)基本的類型的值所占用的內(nèi)存空間。例如:sizeof(int)會(huì)得到int類型的變量所占的字節(jié)數(shù),所得的是一個(gè)size_t類型的整數(shù)。
? ? 注意:我們希望把sizeof運(yùn)算符應(yīng)用于一個(gè)類型,則該類型名就必須放在括號中,例如:sizeof(long double) 。將sizeof運(yùn)算符應(yīng)用于表達(dá)式時(shí),括號就是可選的。
32位與64位系統(tǒng)數(shù)據(jù)類型
不同的平臺(tái)上對不同的數(shù)據(jù)類型分配的字節(jié)數(shù)是不同的,一般的,數(shù)據(jù)類型的字節(jié)數(shù)是由編輯器決定的(編譯期間決定數(shù)據(jù)類型長度)。
簡單來說,平臺(tái)就是CPU+OS+Compiler,cpu的位是指一次性可處理的數(shù)據(jù)量是多少,1字節(jié)=8位,32位處理器可以一次性處理4個(gè)字節(jié)的數(shù)據(jù)量,依次類推。32位操作系統(tǒng)針對的32位的CPU設(shè)計(jì)。64位操作系統(tǒng)針對的64位的CPU設(shè)計(jì)。所以平臺(tái)是三者的組合,它們的字節(jié)長相同時(shí),效率最高。
下面是32位系統(tǒng)與64位系統(tǒng)各數(shù)據(jù)類型對比:
二、極限值
????? ? %u? ? ?輸出無符號整數(shù)值。
????????%e? ? ?輸出浮點(diǎn)數(shù)的極限值,表示這個(gè)數(shù)值是指數(shù)形式。
????????%f? ? ? 說明符表示沒有指數(shù)的數(shù)值,它對于非常大或非常小的數(shù)來說相當(dāng)不方便。
| char? ? ? ?%d ? unsigned char? ? ? %u | CHAR_MIN? ? -128 ? ? ? ? ? ? ? ? ? ? ? ? ? 0???? | CHAR_MAX? ? ?127 ? UCHAR_MAX? ? 255 |
| short? ? %d ? unsigned short? ? ?%u | SHRT_MIN? ? -32768 ? ? ? ? ? ? ? ? ? ? ? ? ? 0 | SHRT_MAX? ? ? 32767 ? USHRT_MAX? ? ?65535 |
| int? ? ? ? ? %d ? unsigned? int? ? ? ? %u | INT_MIN? ? ? ? -2147483648 ? ? ? ? ? ? ? ? ? ? ? ? ? 0 | INT_MAX? ? ? ? ? 2147483647 ? UINT_MAX? ? ? ? 4294967295 |
| long? ? ? %ld ? unsigned? long? ? ?%lu | LONG_MIN? ? -2147483648 ? ? ? ? ? ? ? ? ? ? ? ? ? 0 | LONG_MAX? ? ? 2147483647 ? ULONG_MAX? ? 4294967295 |
| long long? %lld ? unsigned? long long? ?%llu | LLONG_MIN? -9223372036854775808 ? ? ? ? ? ? ? ? ? ? ? ? ? 0 | LLONG_MAX? ??9223372036854775807 ? ULLONG_MAX??18446744073709551615 |
| float? ? ? ? ? ? ? ? %e???? | FLT_MIN??1.175e-38 | FLT_MAX? ?3.402823e+38 |
| double? ? ? ? ? ? %e | DBL_MIN? ?2.225e-308 | DBL_MAX? ?1.797693e+308 |
| long double? ? %Le | LDBL_MIN??3.362e-4932 | LDBL_MAX??1.189731e+4932 |
一系列的printf()函數(shù)調(diào)用中,輸出<limits.h><float.h>頭文件中定義的符號的值。計(jì)算機(jī)中的數(shù)值總是受限于該機(jī)器可以存儲(chǔ)的值域,這些符號的值表示每種數(shù)值類型的極限值。
三、類型轉(zhuǎn)換
#include<stdio.h> int main(void) {const float Revenue_Per_150 = 4.5f;//每銷售150個(gè)產(chǎn)品的收入short JanSold = 23500; //一月份的銷售額short FebSold = 19300;short MarSold = 21600;float RevQuarter = 0.0f; //每個(gè)季度的總收入short QuarterSold = JanSold + FebSold + MarSold;//一個(gè)季度總銷售額printf("Stock sold in \nJan:%d\nFeb:%d\nMar:%d\n",JanSold,FebSold,MarSold);printf("Total stock sold in first quarter:%d\n",QuarterSold);RevQuarter = QuarterSold/150*Revenue_Per_150;printf("Sales revenue this quarter is:$%.2f\n",RevQuarter);//這個(gè)季度的銷售收入return 0; }? ? 輸出的結(jié)果如下所示:顯然輸出的結(jié)果是錯(cuò)誤的,不應(yīng)該是得到的負(fù)值。
Stock sold in Jan:23500 Feb:19300 Mar:21600 Total stock sold in first quarter:-1136 Sales revenue this quarter is:$-31.50錯(cuò)誤1:QuarterSold變量聲明為short類型,其初始值定義為3個(gè)月的銷售總額,總和是64400,而對于short類型而言,其最大值是32767。現(xiàn)在問題來了,我們試圖在變量中存儲(chǔ)對short類型而言過大的數(shù)字,計(jì)算機(jī)不能正確解釋QuarterSold的值,所以輸出了負(fù)數(shù)。
解決辦法:給QuarterSold變量使用unsigned long類型。來存儲(chǔ)非常大的數(shù)字,還可以把每月銷售量的變量指定為無符號類型。
錯(cuò)誤2:RevQuarter = QuarterSold/150*Revenue_Per_150; 由于乘除的優(yōu)先級相同,先回計(jì)算64400/150=429.333 最終會(huì)舍棄.333。在下一步計(jì)算過程中會(huì)有出入。
解決辦法:方案1:語句改為RevQuarter = QuarterSold*Revenue_Per_150/150;
????????????? ? 方案2:語句改為RevQuarter = QuarterSold/150.0*Revenue_Per_150;
????????????? ? 方案3:語句改為RevQuarter = (float)QuarterSold/150*Revenue_Per_150;
//最終正確的格式如下: #include<stdio.h> int main(void) {const float Revenue_Per_150 = 4.5f;//每銷售150個(gè)產(chǎn)品的收入unsigned short JanSold = 23500; //一月份的銷售額unsigned short FebSold = 19300;unsigned short MarSold = 21600;float RevQuarter = 0.0f; //每個(gè)季度的總收入unsigned long QuarterSold = JanSold + FebSold + MarSold;//一個(gè)季度總銷售額printf("Stock sold in \nJan:%u\nFeb:%u\nMar:%u\n",JanSold,FebSold,MarSold); printf("Total stock sold in first quarter:%d\n",QuarterSold);//-->>Total stock sold in first quarter:64400RevQuarter =(float) QuarterSold/150*Revenue_Per_150;printf("Sales revenue this quarter is:$%.2f\n",RevQuarter);//這個(gè)季度的銷售收入 //-->>Sales revenue this quarter is:$1932.00return 0; }?
強(qiáng)制類型轉(zhuǎn)換:一種類型顯示轉(zhuǎn)化為另一種類型的過程。
?
? ? ?把變量從一種類型轉(zhuǎn)換為另一種類型,應(yīng)該把目標(biāo)類型放在變量前面的括號中。例如:RevQuarter =(float) QuarterSold/150*Revenue_Per_150;
????????? 把表達(dá)式從一種類型強(qiáng)制轉(zhuǎn)換為另一種類型。此時(shí),應(yīng)該把表達(dá)式放在括號中。例如:result = (fouble)(a*a + b*b);?
隱式類型轉(zhuǎn)換:在二元算數(shù)運(yùn)算中使用不同類型的操作數(shù),編譯器就會(huì)把其中一個(gè)值域較小的操作數(shù)類型轉(zhuǎn)化為另一個(gè)操作數(shù)的類型。 例如:RevQuarter = QuarterSold/150*Revenue_Per_150;計(jì)算為64400(int)/150(int),結(jié)果是429(int) , 再將429(int轉(zhuǎn)換為float)乘以4.5(float),得到1930.5(float)。因?yàn)镮nt類型的值域小于float類型。? ?
?//隱式類型轉(zhuǎn)換的規(guī)則 (1)如果一個(gè)操作數(shù)的類型是long double,就把另一個(gè)操作數(shù)轉(zhuǎn)換為long double類型。 (2)否則,如果一個(gè)操作數(shù)的類型是double,就把另一個(gè)操作數(shù)轉(zhuǎn)換為double類型。 (3)否則,如果一個(gè)操作數(shù)的類型是float,就把另一個(gè)操作數(shù)轉(zhuǎn)換為float類型。 (4)否則,如果兩個(gè)操作數(shù)的類型都是帶符號的整數(shù)或者無符號的整數(shù),就把級別較低的操作數(shù)換位另一個(gè)操作數(shù)類型。無符號整數(shù)類型的級別從低到高為:signed char ,short ,int ,long ,long long每個(gè)無符號的整數(shù)類型的級別都與對應(yīng)的帶符號整數(shù)類型相同,所以unsigned int類型的級別與int類型的相同。 (5)否則,如果帶符號整數(shù)類型的操作數(shù)級別低于無符號整數(shù)類型的級別,就把帶符號整數(shù)類型的操作數(shù)轉(zhuǎn)換為無符號整數(shù)類型。 (6)否則,如果帶符號的整數(shù)類型的值域包含了無符號整數(shù)類型所表示的值,就把無符號的整數(shù)類型轉(zhuǎn)換為帶符號的整數(shù)類型。 (7)否則,兩個(gè)操作數(shù)都轉(zhuǎn)換為帶符號的整數(shù)類型對應(yīng)的無符號的整數(shù)類型。//賦值語句中的隱式類型轉(zhuǎn)換例如: long double tital_cost = double cost;當(dāng)操作數(shù)的類型不同時(shí)候,賦值操作總是要把右操作數(shù)的結(jié)果轉(zhuǎn)換為做操作數(shù)的類型。所以上述操作的結(jié)果會(huì)轉(zhuǎn)化為long double類型。編譯器不會(huì)發(fā)出警告,因?yàn)閐ouble類型的所有值都可以表示為long double.//隱式類型轉(zhuǎn)換的規(guī)則 (1)如果一個(gè)操作數(shù)的類型是long double,就把另一個(gè)操作數(shù)轉(zhuǎn)換為long double類型。 (2)否則,如果一個(gè)操作數(shù)的類型是double,就把另一個(gè)操作數(shù)轉(zhuǎn)換為double類型。 (3)否則,如果一個(gè)操作數(shù)的類型是float,就把另一個(gè)操作數(shù)轉(zhuǎn)換為float類型。 (4)否則,如果兩個(gè)操作數(shù)的類型都是帶符號的整數(shù)或者無符號的整數(shù),就把級別較低的操作數(shù)換位另一個(gè)操作數(shù)類型。無符號整數(shù)類型的級別從低到高為:signed char ,short ,int ,long ,long long每個(gè)無符號的整數(shù)類型的級別都與對應(yīng)的帶符號整數(shù)類型相同,所以unsigned int類型的級別與int類型的相同。 (5)否則,如果帶符號整數(shù)類型的操作數(shù)級別低于無符號整數(shù)類型的級別,就把帶符號整數(shù)類型的操作數(shù)轉(zhuǎn)換為無符號整數(shù)類型。 (6)否則,如果帶符號的整數(shù)類型的值域包含了無符號整數(shù)類型所表示的值,就把無符號的整數(shù)類型轉(zhuǎn)換為帶符號的整數(shù)類型。 (7)否則,兩個(gè)操作數(shù)都轉(zhuǎn)換為帶符號的整數(shù)類型對應(yīng)的無符號的整數(shù)類型。//賦值語句中的隱式類型轉(zhuǎn)換例如: long double tital_cost = double cost;當(dāng)操作數(shù)的類型不同時(shí)候,賦值操作總是要把右操作數(shù)的結(jié)果轉(zhuǎn)換為做操作數(shù)的類型。所以上述操作的結(jié)果會(huì)轉(zhuǎn)化為long double類型。編譯器不會(huì)發(fā)出警告,因?yàn)閐ouble類型的所有值都可以表示為long double.四、枚舉
??? 在編程時(shí)候,常常希望存儲(chǔ)一組可能值中的一個(gè)?。例如:一個(gè)變量存儲(chǔ)表示當(dāng)前月份的值。這個(gè)值應(yīng)該只存儲(chǔ)12個(gè)可能值中的一個(gè),分別對應(yīng)于1~12月。
? ? ?4.1 枚舉類型的定義
?????????? ? ? ? ??enum Weekday{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};
? ? ? ? ? ? ? ? ? ?enum? Weekday today? =? Thursday;
????????? ?只要希望變量有限定數(shù)量的可能值,就可以使用枚舉。
????????? ?第一個(gè)語句定義了枚舉類型Weekday,這個(gè)類型的變量可以有括號中的7個(gè)值得任意一個(gè)。
????????? ?第二個(gè)語句定義了Weekday類型的一個(gè)變量,把它初始化為Thursday,其對應(yīng)的值是3。
? ? ?? 1>格式為: enum ?枚舉的標(biāo)記 {枚舉器/枚舉常量};,知Weekday是一個(gè)標(biāo)識符,可有可無;
????? 2>枚舉常量的名稱必須是唯一的;枚舉器有默認(rèn)值,編譯器會(huì)把int類型的整數(shù)值賦予給每個(gè)名稱;名稱間用逗號,隔開;其數(shù)量是可以任意的;枚舉器的值不要求是唯一的,除非有特殊原因讓某些枚舉器的值相同,否則應(yīng)確保這些值也是唯一的;
? ? ? ?3>枚舉是一個(gè)整數(shù)類型, 每個(gè)枚舉常量對應(yīng)不同的整數(shù)值;
? ? ? ?4>第一個(gè)枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個(gè)成員上加1。
? ? ? 5> 可以人為設(shè)定枚舉成員的值,從而自定義某個(gè)范圍內(nèi)的整數(shù)。 ?
? ? ? 6> 枚舉型是預(yù)處理指令#define的替代。
? ? ? 7> 類型定義以分號;結(jié)束。
? ? ?4.2 使用枚舉類型對變量進(jìn)行聲明? ?
新的數(shù)據(jù)類型定義完成后,它就可以使用了。我們已經(jīng)見過最基本的數(shù)據(jù)類型,如:整型int, 單精度浮點(diǎn)型float, 雙精度浮點(diǎn)型double, 字符型char, 短整型short等等。用這些基本數(shù)據(jù)類型聲明變量通常是這樣:
char???? a;?//變量a的類型均為字符型char
char???? letter;
int??????? x,
?????????? y,
?????????? z;?//變量x,y和z的類型均為整型int
int?????? number;
double? m,?n;
double? result;?//變量result的類型為雙精度浮點(diǎn)型double
?
既然枚舉也是一種數(shù)據(jù)類型,那么它和基本數(shù)據(jù)類型一樣也可以對變量進(jìn)行聲明。
方法一:枚舉類型的定義和變量的聲明分開
enum?DAY
{
??????MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN
};
?
enum?DAY?yesterday;
enum?DAY?today;
enum?DAY?tomorrow;?//變量tomorrow的類型為枚舉型enum?DAY
enum?DAY?good_day,?bad_day;?//變量good_day和bad_day的類型均為枚舉型enum?DAY
?
方法二:類型定義與變量聲明同時(shí)進(jìn)行:
//未命名的枚舉類型,
//在創(chuàng)建枚舉類型的變量時(shí),可以不指定標(biāo)記,這樣就沒有枚舉類型了。其可能的枚舉器從saturday到friday
//該語句還生命了未命名類型的變量workday;可以用通常的方式給其賦值。
//局限性:只要限制是,必須在定義該類型的語句中聲明它的所有變量。由于沒有類型名,無法在代碼的后面定義該類型的其他的變量
enum?//跟第一個(gè)定義不同的是,此處的標(biāo)號DAY省略,這是允許的。
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
}?workday;?//變量workday的類型為枚舉型enum?DAY
workday =? monnday;
?
enum?week?{?Mon=1,?Tue,?Wed,?Thu,?Fri?Sat,?Sun}?days;?//變量days的類型為枚舉型enum?week
?
enum?BOOLEAN?{?false,?true?}?end_flag,?match_flag;?//定義枚舉類型并聲明了兩個(gè)枚舉型變量
?
方法三:用typedef關(guān)鍵字將枚舉類型定義成別名,并利用該別名進(jìn)行變量聲明:
typedef?enum?workday
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
}?workday;?//此處的workday為枚舉型enum?workday的別名
?
workday?today,?tomorrow;?//變量today和tomorrow的類型為枚舉型workday,也即enum?workday
?
enum workday中的workday可以省略:
typedef?enum
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
}?workday;?//此處的workday為枚舉型enum?workday的別名
workday?today,?tomorrow;?//變量today和tomorrow的類型為枚舉型workday,也即enum?workday
?
也可以用這種方式:
typedef?enum?workday
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
};
workday?today,?tomorrow;?//變量today和tomorrow的類型為枚舉型workday,也即enum?workday
?
注意:同一個(gè)程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。錯(cuò)誤示例如下所示:
錯(cuò)誤聲明一:存在同名的枚舉類型
typedef?enum
{
????wednesday,
????thursday,
????friday
}?workday;
typedef?enum?WEEK
{
????saturday,
????sunday?=?0,
????monday,
}?workday;
?
錯(cuò)誤聲明二:存在同名的枚舉成員
typedef?enum
{
????wednesday,
????thursday,
????friday
}?workday_1;
typedef?enum?WEEK
{
????wednesday,
????sunday?=?0,
????monday,
}?workday_2;
?
? ?4.3 使用枚舉類型的變量? ??
4.3.1 對枚舉型的變量賦值。
實(shí)例將枚舉類型的賦值與基本數(shù)據(jù)類型的賦值進(jìn)行了對比:
方法一:先聲明變量,再對變量賦值
#include<stdio.h>
/*?定義枚舉類型?*/
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?};
void?main()
{
????/*?使用基本數(shù)據(jù)類型聲明變量,然后對變量賦值?*/
????int?x,?y,?z;
????
????x?=?10;
????y?=?20;
????z?=?30;
????
????/*?使用枚舉類型聲明變量,再對枚舉型變量賦值?*/
????enum?DAY?yesterday,?today,?tomorrow;
????
????yesterday?=?MON;
????today?????=?TUE;
????tomorrow??=?WED;
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);
}
?
方法二:聲明變量的同時(shí)賦初值
#include?<stdio.h>
/*?定義枚舉類型?*/
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?};
void?main()
{
????/*?使用基本數(shù)據(jù)類型聲明變量同時(shí)對變量賦初值?*/
????int?x=10,?y=20,?z=30;
????/*?使用枚舉類型聲明變量同時(shí)對枚舉型變量賦初值?*/
????enum?DAY?yesterday?=?MON,?
?????????????????????? ?today?=?TUE,
?????????????????? tomorrow?=?WED;
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);
}
?
方法三:定義類型的同時(shí)聲明變量,然后對變量賦值。
#include?<stdio.h>
/*?定義枚舉類型,同時(shí)聲明該類型的三個(gè)變量,它們都為全局變量?*/
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?}?yesterday,?today,?tomorrow;
/*?定義三個(gè)具有基本數(shù)據(jù)類型的變量,它們都為全局變量?*/
int?x,?y,?z;
void?main()
{
????/*?對基本數(shù)據(jù)類型的變量賦值?*/
????x?=?10;??y?=?20;??z?=?30;
????
????/*?對枚舉型的變量賦值?*/
????yesterday?=?MON;
????today?????=?TUE;
????tomorrow??=?WED;
????printf("%d?%d?%d?\n",?x,?y,?z);?//輸出:10?20?30
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);?//輸出:1?2?3
}
?
方法四:類型定義,變量聲明,賦初值同時(shí)進(jìn)行。
#include?<stdio.h>
/*?定義枚舉類型,同時(shí)聲明該類型的三個(gè)變量,并賦初值。它們都為全局變量?*/
enum?DAY
{
????MON=1,?
????TUE,
????WED,
????THU,
????FRI,
????SAT,
????SUN?
}
yesterday?=?MON,?today?=?TUE,?tomorrow?=?WED;
/*?定義三個(gè)具有基本數(shù)據(jù)類型的變量,并賦初值。它們都為全局變量?*/
int?x?=?10,?y?=?20,?z?=?30;
void?main()
{
????printf("%d?%d?%d?\n",?x,?y,?z);?//輸出:10?20?30
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);?//輸出:1?2?3
}
?
4.3.2 對枚舉型的變量賦整數(shù)值時(shí),需要進(jìn)行類型轉(zhuǎn)換。
#include?<stdio.h>
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?};
void?main()
{
????enum?DAY?yesterday,?today,?tomorrow;
????yesterday?=?TUE;
????today?=?(enum?DAY)?(yesterday?+?1);?//類型轉(zhuǎn)換
????tomorrow?=?(enum?DAY)?30;?//類型轉(zhuǎn)換
????//tomorrow?=?3;?//錯(cuò)誤
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);?//輸出:2?3?30
}
?
4.3.3 使用枚舉型變量
#include<stdio.h>
enum
{?
????BELL??????????=?'\a',
????BACKSPACE?=?'\b',
????HTAB?????????=?'\t',
????RETURN???? ?=?'\r',
????NEWLINE????=?'\n',?
????VTAB?????????=?'\v',
????SPACE???????=?'?'
};
enum?BOOLEAN?{?FALSE?=?0,?TRUE?}?match_flag;
void?main()
{
????int?index?=?0;
????int?count_of_letter?=?0;
????int?count_of_space?=?0;
????char?str[]?=?"I'm?Ely?efod";
????match_flag?=?FALSE;
????for(;?str[index]?!=?'\0';?index++)
????????if(?SPACE?!=?str[index]?)
????????????count_of_letter++;
????????else
????????{
????????????match_flag?=?(enum?BOOLEAN)?1;
????????????count_of_space++;
????????}
????
????printf("%s?%d?times?%c",?match_flag???"match"?:?"not?match",?count_of_space,?NEWLINE);
????printf("count?of?letters:?%d?%c%c",?count_of_letter,?NEWLINE,?RETURN);
}
?
輸出:
match 2 times
count of letters: 10
Press any key to continue
4.4 枚舉類型與sizeof運(yùn)算符
復(fù)制代碼 #include <stdio.h>enum escapes { BELL = '\a',BACKSPACE = '\b',HTAB = '\t',RETURN = '\r',NEWLINE = '\n', VTAB = '\v',SPACE = ' ' };enum BOOLEAN { FALSE = 0, TRUE } match_flag;void main() {printf("%d bytes \n", sizeof(enum escapes)); //4 bytesprintf("%d bytes \n", sizeof(escapes)); //4 bytesprintf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytesprintf("%d bytes \n", sizeof(BOOLEAN)); //4 bytesprintf("%d bytes \n", sizeof(match_flag)); //4 bytesprintf("%d bytes \n", sizeof(SPACE)); //4 bytesprintf("%d bytes \n", sizeof(NEWLINE)); //4 bytesprintf("%d bytes \n", sizeof(FALSE)); //4 bytesprintf("%d bytes \n", sizeof(0)); //4 bytes }4.5 選擇枚舉值
可以給任意或所有的枚舉器指定自己的整數(shù)值。盡管枚舉器使用的名稱必須是唯一的,但是枚舉器的值不要求是唯一的。除非有特殊的原因讓某些枚舉器的值相同,否則一般應(yīng)確保這些值也是唯一的。
例如:
4.6 綜合舉例
#include<stdio.h>enum Season {spring, summer=100, fall=96, winter };typedef enum {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } Weekday;void main() {/* Season */printf("%d \n", spring); // 0printf("%d, %c \n", summer, summer); // 100, dprintf("%d \n", fall+winter); // 193enum Season mySeason=winter;if(winter==mySeason)printf("mySeason is winter \n"); // mySeason is winterint x=100;if(x==summer)printf("x is equal to summer\n"); // x is equal to summerprintf("%d bytes\n", sizeof(spring)); // 4 bytes/* Weekday */printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4Weekday today = Saturday;Weekday tomorrow;if(today == Monday)tomorrow = Tuesday;elsetomorrow = (Weekday) (today + 1); //remember to convert from int to Weekdayprintf("today == %d? ?tomorrow == %d\n",today,tomorrow); // today == 5? ?tomorrow == 6 }參考鏈接:
? ? ?enum與typedef enum的用法:https://blog.csdn.net/king16304/article/details/52193562
總結(jié)
以上是生活随笔為你收集整理的C语言入门经典——基础知识(数据类型)(32位与64位系统基本数据类型的字节数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命令之 —— grep \ls
- 下一篇: C语言入门经典——基础知识(指针 数组