第3章 数据和C
學(xué)習(xí)筆記——《C Primer Plus》
第3章 數(shù)據(jù)和C
- 3.1 示例程序
- 3.1.1 程序中的新元素
- 3.2 變量與常量數(shù)據(jù)
- 3.3 數(shù)據(jù):數(shù)據(jù)類型關(guān)鍵字
- 3.3.1 整數(shù)
- 3.3.2 浮點(diǎn)數(shù)
- 3.4 C語(yǔ)言基本數(shù)據(jù)類型
- 3.4.1 int 類型
- 1. 聲明int變量
- 2. 初始化變量
- 3. 打印int值
- 4. 八進(jìn)制和十六進(jìn)制
- 5. 顯示八進(jìn)制和十六進(jìn)制
- 3.4.2 使用字符:char 類型
- 1. 聲明char類型變量
- 2.字符常量和初始化
- 3. 打印字符
- 3.4.3 _Bool 類型
- 3.4.4 float 、double 和 long double
- 1. 聲明浮點(diǎn)類型變量
- 2. 浮點(diǎn)型常量
- 3.打印浮點(diǎn)值
- 3.4.5 類型大小
- 3.5 使用數(shù)據(jù)類型
- 3.6 參數(shù)和陷阱
- 3.7 刷新輸出
- 3.8 編程練習(xí)
程序離不開(kāi)數(shù)據(jù)。把數(shù)字、字母和文字輸入電腦,就是希望它利用這些數(shù)據(jù)完成某些任務(wù)。
3.1 示例程序
#include <stdio.h> int main(void) {float weight; //聲明一個(gè)體重變量float value; //相等重量的白金價(jià)值printf("Are you worth your weight in platinum?\n");printf("Let's check it out.\n"); printf("Please enter your weight in pounds:");//獲取用戶輸入scanf("%f",&weight);//假設(shè)白金的價(jià)格是每蠱司$1700 //14.5833用于把英鎊常衡蠱司轉(zhuǎn)換為金衡蠱司value = 1700.0 * weight * 14.5833;printf("Your weight in platinum is worth $%.2f.\n",value);printf("You are easily worth that! If platinum prices drop,\n"); printf("eat more to maintain your value.\n");return 0; }即使輸入正確無(wú)誤,編譯器也可能給出一些警告,如“警告:從double類型轉(zhuǎn)變成float類型可能會(huì)丟失數(shù)據(jù)”。錯(cuò)誤(error)信息表明程序中有錯(cuò),不能進(jìn)行編譯。而警告(warning)表明盡管編寫代碼有效,但可能結(jié)果不是我們想要的,警告不會(huì)終止編譯。
3.1.1 程序中的新元素
(1)浮點(diǎn)數(shù)據(jù)類型(float)的變量,比整數(shù)型(int)的變量表示的范圍更大。float類型可以儲(chǔ)存帶小數(shù)的數(shù)字。
(2)在printf()中使用 %f 來(lái)處理浮點(diǎn)值。%.2f 中的 .2 用于精確控制輸出,指定輸出的浮點(diǎn)數(shù)只顯示小數(shù)點(diǎn)后面兩位。
(3)scanf()函數(shù)用于讀取鍵盤的輸入。%f 說(shuō)明 scanf() 要讀取用戶從鍵盤輸入的浮點(diǎn)數(shù),&weight 告訴 scanf() 把輸入的值賦給weight 變量。scanf() 函數(shù)使用 & 符號(hào)找到 weight 變量的地點(diǎn)。
3.2 變量與常量數(shù)據(jù)
在程序的指導(dǎo)下,計(jì)算機(jī)可以做很多事情,如數(shù)值計(jì)算、名字排序、執(zhí)行語(yǔ)言等事情。要完成這些任務(wù),程序需要使用數(shù)據(jù),即承載信息的數(shù)字和字符。
有些數(shù)據(jù)類型在程序使用之前已經(jīng)預(yù)先設(shè)定好了,在整個(gè)程序的運(yùn)行過(guò)程中沒(méi)有變化,這稱為常量(constant)。
在程序運(yùn)行期間可能會(huì)改變或被賦值,這稱為變量(variable)。
在實(shí)例代碼中:weight 是一個(gè)變量,14.5833 是一個(gè)常量。
3.3 數(shù)據(jù):數(shù)據(jù)類型關(guān)鍵字
在C語(yǔ)言中,用 int 關(guān)鍵字表示基本的整數(shù)類型;char關(guān)鍵字用于指定字母和其他字符(如,#、$、% 和 * );_Bool類型表示布爾值( true 和 false );_Complex表示復(fù)數(shù);_Imaginary表示虛數(shù)。
按計(jì)算機(jī)的儲(chǔ)存方式可分為兩大基本類型:整數(shù)類型和浮點(diǎn)數(shù)類型。
位(bit):最小的存儲(chǔ)單元,可以儲(chǔ)存0或1。位是計(jì)算機(jī)內(nèi)存的基本構(gòu)建塊。
字節(jié)(byte):是常用的計(jì)算機(jī)存儲(chǔ)單位,1字節(jié)均為8位。既然1位可以表示0或1,那么8位就有256(2的8次方)種可能的0、1組合。通過(guò)二進(jìn)制編碼,便可表示0~255的整數(shù)或一組字符。
字(word):是設(shè)計(jì)計(jì)算機(jī)時(shí)給定的自然存儲(chǔ)單位,個(gè)人計(jì)算機(jī)字長(zhǎng)有32位,64位。計(jì)算機(jī)的字長(zhǎng)越大,其數(shù)據(jù)轉(zhuǎn)移越快,允許的內(nèi)存訪問(wèn)也更多。
3.3.1 整數(shù)
在C語(yǔ)言中,整數(shù)是沒(méi)有小數(shù)部分和指數(shù)部分的數(shù)。計(jì)算機(jī)以二進(jìn)制數(shù)字儲(chǔ)存整數(shù),例如,整數(shù)7以二進(jìn)制寫是111。因此,要在1字節(jié)中儲(chǔ)存該數(shù)字,需要把前5位都設(shè)置成0,后3位設(shè)置成1:
3.3.2 浮點(diǎn)數(shù)
2.75、3.16E7、7.00 和 2e-8 都是浮點(diǎn)數(shù)。如 3.16E7 表示 3.16 × 10^7 ( 3.16 乘以 10 的 7 次方)。
計(jì)算機(jī)把浮點(diǎn)數(shù)分成小數(shù)部分和指數(shù)部分來(lái)表示,而且分開(kāi)儲(chǔ)存這兩部分。
在十進(jìn)制下,可以把 7.00 寫成 0.7E1。這里 0.7 是小數(shù)部分, 1 是指數(shù)部分。當(dāng)然,計(jì)算機(jī)在內(nèi)部使用二進(jìn)制和 2 的冪進(jìn)行儲(chǔ)存。
- 整數(shù)沒(méi)有小數(shù)部分,浮點(diǎn)數(shù)有小數(shù)部分。
- 浮點(diǎn)數(shù)可以表示的范圍比整數(shù)大。
- 對(duì)于一些算術(shù)運(yùn)行(如,兩個(gè)很大的數(shù)相減),浮點(diǎn)數(shù)損失的精度更多。
3.4 C語(yǔ)言基本數(shù)據(jù)類型
3.4.1 int 類型
int 類型的值必須是整數(shù),可以是正整數(shù)、負(fù)整數(shù)或零。
ISO C規(guī)定 int 的取值范圍最小為 -32768 ~ 32767
1. 聲明int變量
int erns; int hogs, cows, goats; //賦值 cows = 112;2. 初始化變量
初始化(initialize)變量就是為變量賦一個(gè)初始值。在C語(yǔ)言中,初始化可以在聲明中完成。
int hogs = 21; int cows = 32, goats = 14; int dogs, cats = 94 //有效,但是這種格式很糟糕最好不要把初始化的變量和未初始化的變量放在同一條聲明中。
簡(jiǎn)而言之,聲明為變量創(chuàng)建和標(biāo)記存儲(chǔ)空間,并為其指定初始值:
3. 打印int值
%d 稱為轉(zhuǎn)義說(shuō)明,%d 指明了在一行中打印整數(shù)的位置;
要確保轉(zhuǎn)義說(shuō)明的數(shù)量與待打印值的數(shù)量相同。
4. 八進(jìn)制和十六進(jìn)制
八進(jìn)制和十六進(jìn)制計(jì)數(shù)很方便,因?yàn)?8 和 16 都是 2 的冪。
十六進(jìn)制數(shù)的每一位數(shù)恰好由4位二進(jìn)制數(shù)表示。例如:十六進(jìn)制數(shù) 3 的二進(jìn)制數(shù)是 0011,十六進(jìn)制數(shù) 5 的二進(jìn)制數(shù)是 0101。因此,十六進(jìn)制數(shù) 35 的位組合是 00110101,十六進(jìn)制數(shù) 53 的位組合是 01010011。
在C語(yǔ)言中,0x 或 0X 前綴表示十六進(jìn)制值;0 前綴表示八進(jìn)制。
使用不同的進(jìn)制數(shù)是為了方便,不會(huì)影響數(shù)被儲(chǔ)存的方式,因?yàn)橛?jì)算機(jī)內(nèi)部都是以二進(jìn)制進(jìn)行編碼。
5. 顯示八進(jìn)制和十六進(jìn)制
%0 顯示八進(jìn)制數(shù)字
%x 顯示十六進(jìn)制數(shù)字
如果要在八進(jìn)制和十六進(jìn)制值前顯示 0 和 0x 前綴,要分別在轉(zhuǎn)換說(shuō)明中加入 #。
3.4.2 使用字符:char 類型
char 類型用于儲(chǔ)存字符(如,字母或標(biāo)點(diǎn)符號(hào)),但是從技術(shù)層面看,char是整數(shù)類型。因?yàn)?char 類型實(shí)際上儲(chǔ)存的是整數(shù)而不是字符。計(jì)算機(jī)使用數(shù)字編碼來(lái)處理字符,即用特定的整數(shù)表示特定的字符。
最常用的編碼是ASCII編碼。如在ASCII碼中,整數(shù) 65 代表大寫字母 A。因此,儲(chǔ)存字母 A 實(shí)際上儲(chǔ)存的是整數(shù) 65。
標(biāo)準(zhǔn)ASCII碼的范圍是 0 ~ 127,只需7位二進(jìn)制數(shù)即可表示。通常,char類型被定義為8位的儲(chǔ)存單元。
1. 聲明char類型變量
char response; char itable, latan;2.字符常量和初始化
如果要把一個(gè)字符常量初始化為字母 A ,不必背ASCII碼。
char grade = 'A';用單引號(hào)括起來(lái)的單個(gè)字符被稱為字符常量(character constant)。
用雙引號(hào)括起來(lái)的字符集合被稱為字符串(string)。
用 ‘A’ 代替 65 才是較為妥當(dāng)?shù)淖龇?#xff0c;最好使用字符常量,而不是數(shù)字代碼值。
把轉(zhuǎn)義序列賦給字符變量時(shí),必須用單引號(hào)把轉(zhuǎn)義序列括起來(lái)。
char nerf = '\n';注意數(shù)字和數(shù)字字符的區(qū)別。例如,字符 4 對(duì)應(yīng)的ASCII碼是 52 。‘4’ 表示字符 4 ,而不是數(shù)值 4 。
3. 打印字符
printf() 函數(shù)用 %c 指明待打印的字符。
如果用 %d 轉(zhuǎn)換說(shuō)明打印 char 類型變量的值(ASCII碼),打印的是一個(gè)整數(shù)。而 %c 轉(zhuǎn)換說(shuō)明告訴 printf() 打印該整數(shù)對(duì)應(yīng)的字符。
輸出結(jié)果:
printf() 函數(shù)中的轉(zhuǎn)換說(shuō)明決定了數(shù)據(jù)的顯示方式,而不是數(shù)據(jù)的儲(chǔ)存方式:
3.4.3 _Bool 類型
用于表示布爾值,即邏輯值 true 和 false。因?yàn)镃語(yǔ)言用值 1 表示 true,值 0 表示 false,所以_Bool類型實(shí)際上也是一種整數(shù)類型。
但原則上它僅占用 1 位存儲(chǔ)空間,因?yàn)閷?duì)于 0 和 1 而言,1 位的存儲(chǔ)空間足夠了。
3.4.4 float 、double 和 long double
各種整數(shù)類型對(duì)于大多數(shù)軟件開(kāi)發(fā)項(xiàng)目而言夠用了。然而,面向金融和數(shù)學(xué)的程序經(jīng)常使用浮點(diǎn)數(shù)。
浮點(diǎn)數(shù)的表示類似于科學(xué)計(jì)數(shù)法(即使用小數(shù)乘以 10 的冪來(lái)表示數(shù)字)。
通常,系統(tǒng)儲(chǔ)存一個(gè)浮點(diǎn)數(shù)要占用 32 位。其中 8 位用于表示指數(shù)的值和符號(hào),剩下 24 位用于表示非指數(shù)部分(也叫尾數(shù)或者有效數(shù))及其符號(hào)。
C語(yǔ)言提供的另一種浮點(diǎn)類型是 double(雙精度)。double 類型至少能表示 10 位有效數(shù)字,而 float 至少能表示 6 位有效數(shù)字。
1. 聲明浮點(diǎn)類型變量
浮點(diǎn)變量的聲明和初始化方式與整型變量相同:
float noch, jonah; double trouble; float planck = 6.63e - 34; long double gnp;2. 浮點(diǎn)型常量
書寫浮點(diǎn)型常量的形式有多種,浮點(diǎn)型常量的基本形式是:有符號(hào)的數(shù)字(包括小數(shù)點(diǎn)),后面緊跟 e 或 E,最后是一個(gè)有符號(hào)數(shù)表示 10 的指數(shù)。
-1.56E+12 2.87e-3正號(hào)可以省略。可以沒(méi)有小數(shù)點(diǎn)(如,2E5)或沒(méi)有指數(shù)部分(如19.28),但不能同時(shí)省略兩者。可以省略小數(shù)部分(如,3.E16)或整數(shù)部分(如,.45E-6),但是不能同時(shí)省略兩者。
不能愛(ài)浮點(diǎn)常量中間加空格
沒(méi)有后綴的浮點(diǎn)型常量是 double 類型。在浮點(diǎn)數(shù)后面加上 f 或 F 后綴,編譯器會(huì)將浮點(diǎn)型常量看作 float 類型,如 2.3f 和 9.11E9F。
3.打印浮點(diǎn)值
printf() 函數(shù)使用 %f 轉(zhuǎn)換說(shuō)明打印十進(jìn)制計(jì)數(shù)法的 float 和 double 類型浮點(diǎn)數(shù),用 %e 打印指數(shù)計(jì)數(shù)法的浮點(diǎn)數(shù)。
注意:sanf() 函數(shù)中float 用 %f ;double 用 %lf 。
3.4.5 類型大小
sizeof() 是C語(yǔ)言的內(nèi)置運(yùn)算符,以字節(jié)為單位給出指定類型的大小。%zd 轉(zhuǎn)換說(shuō)明匹配 sizeof() 的返回類型。一些不支持C99 和 C11 的編譯器可用 %u 或 %lu。
#include<stdio.h> int main(void) {printf("Type int has a size of %u bytes.\n",sizeof(int));printf("Type double has a size of %lu bytes.\n",sizeof(double));printf("Type char has a size of %zd bytes.\n",sizeof(char));return 0; }3.5 使用數(shù)據(jù)類型
在使用變量之前必須先聲明,并選擇有意義的變量名。初始化變量應(yīng)使用與變量類型匹配的常數(shù)類型。
int apples = 3; //正確 int oranges = 3.0; //不好的形式把一個(gè)類型的數(shù)值初始化給不同類型的變量時(shí),編譯器會(huì)把值轉(zhuǎn)換成與變量匹配的類型,這將導(dǎo)致部分?jǐn)?shù)據(jù)丟失。
int cost = 12.99; //用 double 類型的值初始化 int 類型的變量 float pi = 3.1415926536; //用 double 類型的值初始化 float 類型的變量第一個(gè)聲明,cost的值是 12 。C編譯器打浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)時(shí)會(huì)直接丟棄(截取)小數(shù)部分,而不進(jìn)行四舍五入。
第二個(gè)聲明會(huì)損失一些精度,因?yàn)镃只保證了 float 類型前6位的精度。
許多程序員和公司內(nèi)部都有系統(tǒng)化的命名約定,在變量名中體現(xiàn)其類型。例如,用 i_ 前綴表示 int 類型,如這樣一眼就能看出 i_smart 是 int 類型的變量。
3.6 參數(shù)和陷阱
傳遞給函數(shù)的信息被稱為參數(shù)。
例如,printf(“Hello,pal”); 函數(shù)調(diào)用有一個(gè)參數(shù):“Hello,pal”。雙引號(hào)中的字符序列被稱為字符串(string)。
關(guān)鍵要理解無(wú)論雙引號(hào)中包含多少個(gè)字符和標(biāo)點(diǎn)符號(hào),一個(gè)字符串就是一個(gè)參數(shù)。
于此類似,scanf( “%d”, &weight) 函數(shù)調(diào)用有兩個(gè)參數(shù):"%d" 和 &weight。C語(yǔ)言用逗號(hào)分隔函數(shù)中的參數(shù)。
printf() 和 scanf() 函數(shù)用第一個(gè)參數(shù)表明后續(xù)有多少個(gè)參數(shù),即第一個(gè)字符串中的轉(zhuǎn)換說(shuō)明和后面的參數(shù)分別對(duì)應(yīng)。
3.7 刷新輸出
printf() 何時(shí)把輸出發(fā)送到屏幕上??? 最初,printf() 語(yǔ)句把輸出發(fā)送到一個(gè)叫作緩沖區(qū)(buffer)的中間存儲(chǔ)區(qū)域。C標(biāo)準(zhǔn)明確規(guī)定了何時(shí)把緩沖區(qū)中的內(nèi)容發(fā)送到屏幕:當(dāng)緩沖區(qū)滿、遇到換行字符或需要輸入的時(shí)候(從緩沖區(qū)把數(shù)據(jù)發(fā)送到屏幕或文件被稱為刷新緩沖區(qū))。
如,前面的 printf() 語(yǔ)句既沒(méi)有填滿緩沖區(qū),也沒(méi)有換行符,但如果下一條是 scanf() 語(yǔ)句,要求用戶輸入,這就迫使 printf() 的輸出被發(fā)送到屏幕上。
3.8 編程練習(xí)
點(diǎn)擊鏈接:
link.
總結(jié)
- 上一篇: 第2章 线性表
- 下一篇: Unit Three-Program t