關(guān)于我們
書單推薦
新書推薦
|
C程序設計
本書內(nèi)容包括三個方面: 1)程序的基本構(gòu)造, 如程序的三種基本結(jié)構(gòu)、函數(shù)、常量、變量等; 2)程序的構(gòu)造方法, 如函數(shù)分解、遞歸、常見算法等; 3)程序的數(shù)據(jù)描述, 如數(shù)組、結(jié)構(gòu)體、文件等。全書以C語言為載體, 不僅介紹了C語言的基本語法, 更重要的是, 通過C語言的語法元素展示了如何構(gòu)造出一個個完整的程序。
全書以C語言為載體,不僅介紹了C語言的基本語法,更重要的是通過C語言的語法元素展示了如何構(gòu)造出一個個完整的程序。
與已有的C語言教材相比,本書存在以下特點:
結(jié)構(gòu)上有所突破。本書不是采用傳統(tǒng)的條塊式結(jié)構(gòu),而是采用層次結(jié)構(gòu),即先介紹一個C語言核心,然后再對這個核心進行擴展。
內(nèi)容組織上有所創(chuàng)新。將文件的基本讀寫操作提前,讓學生更熟悉C文件操作,強化文件操作的訓練,并增強例題的趣味性、綜合性和實用性;增加C程序運行機制的介紹,如變量內(nèi)存分配(變量、指針、靜態(tài)變量)、內(nèi)存布局(堆、棧函數(shù)調(diào)用)、緩沖區(qū)等,讓學生理解C程序運行的背后計算機在發(fā)生什么。
精選例題。將例題分為驗證性例題和示范性例題。驗證性例題純粹是為了驗證和演示某一個知識點,而示范性例題不僅演示了某一用法,更具有示范意義,值得提煉,值得熟記,利于學生形成自己的算法思維,提高程序設計的綜合素質(zhì)和能力。
強調(diào)規(guī)范化、工程化的開發(fā)。介紹了一些常見的工程實踐中的做法,如代碼風格、命名、程序計時、軟件測試等,并強調(diào)軟件工程中功能分解、函數(shù)封裝等原則。
程序設計類課程是計算機科學與技術(shù)及相關(guān)專業(yè)的基礎課程,在計算機專業(yè)課程體系建設中占有十分重要的地位,對于培養(yǎng)學生的思維、能力和興趣具有十分重要的作用。本書的定位是*門程序設計類課程的教材。
本書圍繞程序設計展開,內(nèi)容包括3個方面:
程序的基本構(gòu)造,如程序的3種基本結(jié)構(gòu)、函數(shù)、常量、變量等;
程序的構(gòu)造方法,如函數(shù)分解、遞歸、常見算法等;
程序的數(shù)據(jù)組織,如數(shù)組、結(jié)構(gòu)體、文件等。
全書以C語言為載體,不僅介紹了C語言的基本語法,更重要的是通過C語言的語法元素展示了如何構(gòu)造出一個完整的程序。
與已有的C語言教材相比,本書具有以下特點:
1) 結(jié)構(gòu)上有所突破
在結(jié)構(gòu)上,本書不是采用傳統(tǒng)的條塊式結(jié)構(gòu),即按照知識點一個一個地介紹,而是采用層次結(jié)構(gòu),即先介紹一個C語言核心,其中包括了C語言*常見的用法,然后再對這個核心進行擴展。實踐證明,這種結(jié)構(gòu)更容易被學生接受,教學效果更好。
2) 內(nèi)容組織上有所創(chuàng)新
在內(nèi)容組織上,有以下兩點創(chuàng)新:
(1) 將文件的基本讀寫操作提前到輸入輸出章節(jié)(第3章)。這樣安排的好處是: 一方面讓學生更加熟悉C文件操作,強化了文件操作的訓練;另一方面可以增強例題的趣味性、綜合性和實用性,更容易引起學生的興趣。
(2) 增加C程序運行機制的介紹。C語言很多知識點與計算機硬件有著緊密的聯(lián)系,如變量內(nèi)存分配(變量、指針、靜態(tài)變量)、內(nèi)存布局(堆、棧函數(shù)調(diào)用)、寄存器(寄存器變量)、緩沖區(qū)等,要深入地理解C程序不可避免地涉及基本的計算機系統(tǒng)原理。在本書中,專設一章把這些內(nèi)容串起來,讓學生理解C程序運行的背后計算機在發(fā)生什么。
3) 精選例題
本書的例題經(jīng)過了精心的選擇和組織。根據(jù)例題的性質(zhì),將例題分為驗證性例題和示范性例題。驗證性例題純粹是為了驗證和演示某一個知識點。例如,在printf函數(shù)中用%d、%o和%x等不同格式來輸出一個整數(shù),通過這個例子,可以驗證不同格式符的不同。而示范性例題不僅演示了某一用法,更具有示范意義,值得提煉,值得熟記。例如,判斷一個數(shù)是否為素數(shù)的例子,毫無疑問需要學生完全掌握。本書中的示范性例題都經(jīng)過了精心挑選,值得好好學習和品讀(為了區(qū)分,示范性例題在例題編號后加了一個星號,如例2.6)。本書也注重對例題的分析,盡量讓學生通過一個題目掌握一類題目的解法。
4) 強調(diào)規(guī)范化、工程化的開發(fā)
程序設計具有很強的工程化屬性,因此本書也一直強調(diào)程序設計的規(guī)范化和工程化思想,書中介紹了一些常見的工程實踐中的做法,如代碼風格、命名、程序計時、軟件測試等,并強調(diào)軟件工程中功能分解、函數(shù)封裝等原則。
另外,為了方便讀者查找和復習,本書提供了電子版的例題索引;為了方便教學,本書還提供了電子版的PPT演示文稿。讀者可以到清華大學出版社網(wǎng)站免費下載。
本書是在《C語言與程序設計方法》(第2版)(萬常選、舒蔚、駱斯文、劉喜平編著)的基礎上編寫的。其中,第1~5、9、14~15章由劉喜平編寫,第6、8、10、13章由萬常選編寫,第7、11章由舒蔚編寫,第12章由駱斯文編寫。劉喜平、萬常選提出本書的編寫大綱,并對全書的初稿進行了修改、補充和總纂。
本書在編寫過程中參閱了大量的參考文獻,在此對參考書目的作者表示衷心感謝!
由于水平有限,加上編寫時間倉促,書中難免會有不少缺點或錯誤,敬請專家和讀者批評指正。
作者
2017年1月
第1章程序設計與軟件開發(fā)11.1程序設計的基本概念1
1.1.1程序1
1.1.2程序設計語言2
1.1.3程序設計4
1.2算法與數(shù)據(jù)結(jié)構(gòu)7
1.2.1算法及其特征7
1.2.2算法的結(jié)構(gòu)9
1.2.3算法的描述10
1.2.4數(shù)據(jù)結(jié)構(gòu)14
1.3軟件開發(fā)16
1.3.1軟件16
1.3.2軟件工程16
1.4本章小結(jié)17
習題119
第2章C語言概述202.1C語言的發(fā)展與特點20
2.1.1C語言的發(fā)展20
2.1.2C語言的特點21
2.2一個C程序?qū)嵗?2
2.2.1編寫和運行C程序23
2.2.2注釋23
2.2.3預處理命令24
2.2.4程序主體24
2.3C語言的字符集與標識符26
2.4數(shù)據(jù)類型27C程序設計:方法與實踐目錄2.5常量和變量28
2.5.1常量28
2.5.2變量28
2.6運算符和表達式30
2.6.1運算符30
2.6.2表達式32
2.7輸入與輸出33
2.7.1輸出函數(shù)printf33
2.7.2輸入函數(shù)scanf34
2.8語句36
2.8.1簡單語句36
2.8.2語句塊36
2.8.3if語句37
2.8.4while語句39
2.8.5for語句39
2.9函數(shù)41
2.10編程實踐: 代碼風格42
2.11本章小結(jié)44
習題248
第3章數(shù)據(jù)類型與輸入輸出493.1整型50
3.1.1整數(shù)的內(nèi)部表示51
3.1.2整型常量51
3.1.3整數(shù)的輸出52
3.1.4整數(shù)的輸入55
3.2浮點型57
3.2.1浮點常量58
3.2.2浮點數(shù)的內(nèi)部表示58
3.2.3浮點數(shù)的輸出58
3.2.4浮點數(shù)的輸入60
3.2.5浮點數(shù)的比較和計算60
3.3字符型62
3.3.1字符型數(shù)據(jù)的內(nèi)部表示62
3.3.2字符常量和變量63
3.3.3字符輸出64
3.3.4字符輸入65
3.3.5字符處理66
3.4數(shù)組68
3.4.1什么是數(shù)組68
3.4.2數(shù)組的內(nèi)部表示69
3.4.3數(shù)組元素的訪問69
3.4.4數(shù)組的初始化70
3.5字符串71
3.5.1字符串常量71
3.5.2用字符數(shù)組處理字符串72
3.5.3字符串的輸出73
3.5.4字符串的輸入74
3.6文本文件輸入與輸出77
3.6.1聲明FILE 類型的變量78
3.6.2打開文件78
3.6.3關(guān)閉文件79
3.6.4讀寫文件79
3.7變量的進一步討論81
3.7.1變量的聲明與初始化81
3.7.2限定詞const82
3.8編程實踐: 命名82
3.9本章小結(jié)83
習題386
第4章運算符與表達式894.1運算符與表達式概述89
4.1.1C運算符簡介89
4.1.2C表達式簡介91
4.2算術(shù)運算符和算術(shù)表達式91
4.2.1算術(shù)運算符91
4.2.2算術(shù)表達式92
4.2.3算術(shù)表達式的例子93
4.3賦值運算符和賦值表達式93
4.3.1賦值運算符94
4.3.2賦值表達式94
4.3.3復合賦值運算符95
4.4增量減量運算符96
4.5子表達式的求值順序97
4.6數(shù)據(jù)類型的轉(zhuǎn)換99
4.6.1隱式類型轉(zhuǎn)換99
4.6.2賦值運算符兩側(cè)數(shù)據(jù)的類型轉(zhuǎn)換100
4.6.3強制類型轉(zhuǎn)換103
4.7逗號運算符和逗號表達式104
4.8本章小結(jié)105
習題4107
第5章分支結(jié)構(gòu)1105.1關(guān)系運算符和關(guān)系表達式110
5.2邏輯運算符和邏輯表達式111
5.2.1邏輯運算符111
5.2.2邏輯表達式112
5.3條件運算符和條件表達式114
5.4C語句概述114
5.5if語句116
5.6switch語句119
5.7應用舉例122
5.8本章小結(jié)127
習題5128
第6章循環(huán)結(jié)構(gòu)與程序設計基本算法1336.1循環(huán)結(jié)構(gòu)與控制語句133
6.1.1while語句133
6.1.2for語句134
6.1.3dowhile語句136
6.1.4循環(huán)嵌套139
6.1.5流程控制語句(break語句、continue語句和goto語句)140
6.2控制循環(huán)的基本方法144
6.2.1通過計數(shù)器變量控制循環(huán)144
6.2.2通過程序執(zhí)行的狀態(tài)控制循環(huán)148
6.3窮舉算法153
6.4迭代與遞推算法157
6.4.1迭代157
6.4.2遞推159
6.5程序設計實例162
6.6編程實踐: 程序計時171
6.7本章小結(jié)172
習題6175
第7章函數(shù)與結(jié)構(gòu)化程序設計1807.1函數(shù)180
7.1.1為什么要使用函數(shù)180
7.1.2函數(shù)定義183
7.1.3函數(shù)調(diào)用188
7.1.4函數(shù)原型與函數(shù)聲明190
7.1.5函數(shù)的執(zhí)行193
7.1.6主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)傳遞195
7.1.7函數(shù)設計的思路198
7.2遞歸調(diào)用與遞歸算法202
7.2.1遞歸調(diào)用的執(zhí)行過程202
7.2.2遞歸算法204
7.2.3Hanoi塔問題206
7.3程序的函數(shù)分解208
7.4C程序結(jié)構(gòu)217
7.4.1編譯預處理命令217
7.4.2全局聲明224
7.4.3函數(shù)225
7.4.4C程序的邏輯與物理構(gòu)成225
7.5編程實踐: 軟件測試227
7.6本章小結(jié)229
習題7232
第8章指針與數(shù)組2368.1指針與指針變量237
8.1.1指針的概念237
8.1.2指針變量的聲明與初始化239
8.1.3指針的基本運算241
8.2數(shù)組的指針246
8.2.1一維數(shù)組的指針246
8.2.2二維數(shù)組251
8.2.3二維數(shù)組的元素指針和行指針256
8.2.4指向一維數(shù)組的指針變量(行指針變量)260
8.3字符指針與字符串262
8.3.1字符串處理函數(shù)262
8.3.2指向字符的指針變量處理字符串265
8.4指針作為函數(shù)參數(shù)267
8.4.1變量的指針作為函數(shù)參數(shù)267
8.4.2一維數(shù)組的指針作為函數(shù)參數(shù)270
8.4.3二維數(shù)組的指針作為函數(shù)參數(shù)273
8.5返回指針的函數(shù)275
8.6指針數(shù)組277
8.6.1指針數(shù)組的概念及其應用277
8.6.2指針數(shù)組作main函數(shù)的形參280
8.6.3行指針數(shù)組282
8.7編程實踐: 實用字符串處理284
8.8本章小結(jié)288
習題8297
第3章
數(shù)據(jù)類型與輸入輸出
學
習
目
標 了解C語言數(shù)據(jù)類型的分類。
掌握整型數(shù)據(jù)的內(nèi)部表示、整型常量的表示、整型數(shù)據(jù)的輸出和輸入。
理解int、short和long 3種整型數(shù)據(jù)類型的區(qū)別。
掌握浮點常量的表示、浮點數(shù)的內(nèi)部表示、浮點數(shù)的輸出和輸入。
理解float和double兩種數(shù)據(jù)類型的區(qū)別。
掌握字符型常量和變量的表示和聲明、字符型數(shù)據(jù)的內(nèi)部表示、字符的輸出和輸入,掌握常見的字符處理技巧。
理解數(shù)組的內(nèi)部表示,掌握數(shù)組元素的訪問和初始化。
理解如何表示字符串常量,如何用數(shù)組表示來存儲和處理字符串。
掌握字符串的輸出和輸入。
掌握如何向文本文件中輸入和輸出信息。
C語言是一種強類型語言,也就是說,所有的數(shù)據(jù)都是具有某種數(shù)據(jù)類型的,而且必須先聲明后使用。C語言提供的數(shù)據(jù)類型非常豐富,C語言除了提供整型、字符型和浮點型等基本數(shù)據(jù)類型外,還提供數(shù)組、結(jié)構(gòu)體、共用體和指針等數(shù)據(jù)類型。利用這些數(shù)據(jù)類型能方便地描述較復雜的數(shù)據(jù)對象。
C語言的數(shù)據(jù)類型分類如圖3.1所示。
圖3.1C語言的數(shù)據(jù)類型分類
本章將介紹基本類型,其他類型將在后面章節(jié)介紹。C程序設計:方法與實踐第3章數(shù)據(jù)類型與輸入輸出3.1整型
整型是表示整數(shù)的數(shù)據(jù)類型。為了表示不同范圍的整數(shù),C語言提供了豐富的整型類型,它們有的可以表示高達19位數(shù)的整數(shù),有的只能表示5位數(shù)的整數(shù);有的可以表示有符號數(shù),如-23、-98,有的只能表示無符號的數(shù),如1、917。
C語言中的整型類型可以總結(jié)成表3.1。其中括號內(nèi)的內(nèi)容可以省略。表3.1C語言整型類型
有符號型(默認)說明無 符 號 型說明(signed) int基本整型unsigned int無符號基本整型(signed) short (int)短整型unsigned short (int)無符號短整型(signed) long (int)長整型unsigned long (int)無符號長整型(signed) long long (int)unsigned long long (int)C整型類型分為有符號(signed)和無符號(unsigned)兩大類,分別表示有符號數(shù)和無符號數(shù)。對于有符號數(shù),存儲單元的*高位用來存儲符號,0表示+,1表示-。對于無符號數(shù),存儲單元中全部二進制位都用來表示值,而不包括符號。無符號型變量只能存放不帶符號的整數(shù),如23、507等,而不能存放負數(shù),如-23、-98。在默認情況下,整型是有符號的,如果要表示無符號整型,需要顯式地加上unsigned來限定。
C標準沒有具體規(guī)定以上各類數(shù)據(jù)所占內(nèi)存字節(jié)數(shù)(也稱為寬度),各種平臺上有所不同,但是遵循以下原則: long型數(shù)據(jù)的字節(jié)數(shù)應不小于int型,short型不長于int型。例如,對于Win32平臺,在Visual Studio編譯系統(tǒng)中,各整型類型寬度和取值范圍如表3.2所示。在本書中,假定整型數(shù)據(jù)的規(guī)格(寬度、取值范圍)與表3.2保持一致。表3.2整型類型的規(guī)格
類型所占字節(jié)取 值 范 圍int4-2 147 483 648~2 147 483 647,即-231~231-1short2-32 768~32 767,即-215~215-1long4-2 147 483 648~2 147 483 647,即-231~231-1long long8-9 223 372 036 854 775 808~9 223 372 036 854 775 807,
即-263~263-1unsigned int40~4 294 967 295,即0~232-1unsigned short20~65 535,即0~216-1unsigned long40~4 294 967 295,即0~232-1unsigned long long80~18 446 744 073 709 551 615,即0~264-1long long和unsigned long long是在C99標準中引入的,目前主流的編譯器都支持,但是舊的編譯器可能不支持,如Visual C++ 6.0,Turbo C 2.0/3.0。具體到某一個平臺和編譯系統(tǒng),可以用sizeof()運算符來獲取某一種數(shù)據(jù)類型或變量的寬度。其用法是在括號中寫需要獲取寬度的類型名或變量名。例如:
printf("%d", sizeof(int));/輸出int型的寬度/
或者
int a;
printf("%d", sizeof(a));/輸出int型變量a的寬度/
都可以輸出int型的寬度。
3.1.1整數(shù)的內(nèi)部表示
在計算機內(nèi)部,數(shù)據(jù)都以二進制形式存在。那么整數(shù)在內(nèi)存中是如何表示的呢?
無符號整數(shù)的表示比較簡單,直接采用整數(shù)的二進制表示。有符號數(shù)的*高位用于表示符號位,用0表示+,1表示負號。但是,剩余的二進制位并不是二進制表示。從原理上來說,有符號整數(shù)在內(nèi)部采用補碼表示。對于一個數(shù),計算機要使用一定的編碼方式進行存儲。原碼、反碼、補碼是機器存儲一個整數(shù)的編碼方式。
、 原碼。原碼就是符號位加上整數(shù)的絕對值,即用*位表示符號,其余位表示值。原碼是人腦*容易理解和計算的表示方式。
、 反碼。反碼的表示方法是: 正數(shù)的反碼是其本身,負數(shù)的反碼是在其原碼的基礎上,符號位不變,其余各個位取反。
、 補碼。補碼的表示方法是: 正數(shù)的補碼就是其本身;負數(shù)的補碼是在反碼的基礎上加1。
例如,如果用8位二進制表示整數(shù),那么+1=(00000001)原碼=(00000001)反碼=(00000001)補碼
-1=(10000001)原碼=(11111110)反碼=(11111111)補碼圖3.2給出了幾個例子,其中左邊是高位,右邊是低位。圖3.2整數(shù)的內(nèi)部表示示例
為什么int型整數(shù)可以表示-231呢?這要從引入補碼的原因說起。補碼有一個獨特的特征,即 a補碼+b補碼=(a+b)補碼。以8位二進制為例,
1補碼+(-1)補碼= 0 0000001+1 1111111=0 0000000=0補碼
8位二進制可以表示-128,可以認為這樣產(chǎn)生的:
(-128)補碼=(-1)補碼+(-127)補碼=1 1111111+1 0000001=1 0000000
3.1.2整型常量
整型常量即整型常數(shù)。C語言整型常數(shù)可用3種表示方式:
十進制整數(shù)。如124、234、-23、0等。
八進制整數(shù)。以0開頭的數(shù)是八進制數(shù)。如0234表示八進制數(shù)(234)8,它等于十進制數(shù)156。
十六進制整數(shù)。以0x或0X開頭的數(shù)是十六進制數(shù)。如0x234表示十六進制數(shù)(234)16,它等于十進制數(shù)564。注意,十六進制數(shù)只能由數(shù)字0~9和字母a~f(或A~F)組成。
當程序中出現(xiàn)整型常量時,如果它屬于int類型的取值范圍,那么編譯器會自動將它當作int型整數(shù)來處理,否則作為更寬的數(shù)據(jù)類型來處理。為了顯式地要求編譯器把一個常量作為long型處理,可以在后面加一個字母L(或l),如30L、05647L、0x8abfl。為了指明是無符號常量,可以在后面加上字母U(或u),如30U、05647U、0x8abfu。還可以同時加上U和L表示無符號長整型,如30LU、05647LU、0x8abfLU。
3.1.3整數(shù)的輸出
整數(shù)用printf進行格式化輸出。printf函數(shù)的一般調(diào)用格式為: printf(格式化字符串, 輸出參數(shù)列表);
其中,格式化字符串是用雙引號括起來的字符串,它包括兩種信息:
、 格式說明,由%和格式字符組成,如%d、%f等。它的作用是將輸出的對象采用指定的格式輸出。格式說明總是由%字符開始的。
② 普通字符,即需要原樣輸出的字符,它可以是一般字符,也可以是轉(zhuǎn)義字符。
在用printf函數(shù)輸出一個整數(shù)時,要考慮兩個因素: 整數(shù)的類型(int、short、long還是long long)和以什么形式輸出(什么進制,有符號還是無符號)。
可用的格式控制符如表3.3所示,它們分為兩組,一組指示以什么形式輸出,另一組告訴printf函數(shù)該數(shù)據(jù)是什么類型。這些格式控制符的組合如表3.4所示。表3.3printf格式字符
作用格式字符(%)說明輸出形式d以帶符號的十進制形式輸出整數(shù)(正數(shù)不輸出符號)o以無符號八進制形式輸出整數(shù)(不輸出前導符0)x以無符號十六進制形式輸出整數(shù)(不輸出前導符0x)u以無符號十進制形式輸出整數(shù)數(shù)據(jù)類型h用于短整型l用于長整型ll用于long long類型表3.4printf格式字符的組合
數(shù)據(jù)類型輸 出 形 式duox十進制形式
輸出int無符號十進制形式
輸出unsigned int無符號八進制形式
輸出unsigned int無符號十六進制形式
輸出unsigned inth十進制形式
輸出short無符號十進制形式
輸出unsigned short無符號八進制形式
輸出unsigned short無符號十六進制形式
輸出unsigned shortl十進制形式
輸出long無符號十進制形式
輸出unsigned long無符號八進制形式
輸出unsigned long無符號十六進制形式
輸出unsigned longll十進制形式
輸出long long無符號十進制形式
輸出unsigned long long無符號八進制形式
輸出unsigned long long無符號十六進制形式
輸出unsigned long long說明:
① 在選擇格式控制符的時候,要根據(jù)原本的數(shù)據(jù)類型和期望的輸出形式(十進制、八進制還是十六進制)來確定,尤其是數(shù)據(jù)類型說明符(h、l、ll)。
、 這些格式控制符只是指示printf函數(shù)如何解讀、輸出整數(shù)值,不會影響整數(shù)值原本的數(shù)據(jù)類型和存儲形式。
、 同一個值用不同的格式控制符輸出的時候,結(jié)果不同,不是值發(fā)生了變化,而是對值的解讀不同。
④ 用u、o和x格式控制符的時候,將數(shù)據(jù)解讀為無符號數(shù),本應用于輸出無符號數(shù),但是也可以用于有符號數(shù),前提是這種解讀不會造成曲解。C語言中任何數(shù)據(jù)都屬于某種數(shù)據(jù)類型,而且任何一個值的數(shù)據(jù)類型編譯系統(tǒng)都是知道的,那么printf函數(shù)的格式化字符串中為什么還要有h、l、ll這些與數(shù)據(jù)類型相關(guān)的格式控制字符呢?其實,這些格式控制字符只是告訴系統(tǒng)如何來看待后面的值,也就是說,同一個值可以“當作”不同類型的值來輸出。例3.1整型數(shù)據(jù)的格式化輸出。
1#include
2int main() {
3 int a_int=2, b_int=-2;
4 unsigned int c_uint=4294967293;
5 short d_short=2;
6 long e_long=4294967294;
8 printf("a_int: %d, %u, %o, %x\\n", a_int, a_int, a_int, a_int);
9/a_int: 2, 2, 2, 2/
10 printf("b_int: %d, %u, %o, %x\\n", b_int, b_int, b_int, b_int);
11/b_int: -2, 4294967294, 37777777776, fffffffe/
12 printf("a_int: %ld, %lu, %lo, %lx\\n", a_int, a_int, a_int, a_int);
13/a_int: 2, 2, 2, 2/
14 printf("c_uint: %d, %u\\n", c_uint, c_uint);
15/c_uint: -3, 4294967293/
16 printf("d_short: %d, %u\\n", d_short, d_short);
17/d_short: 2, 2/
18 printf("d_short: %hd, %hu\\n", d_short, d_short);
19/d_short: 2, 2/
20 printf("e_long: %hd, %hu\\n", e_long, e_long);
21/e_long: -2, 65534/
22 return 0;
23}
為了方便對照,每一個printf語句的輸出結(jié)果顯示在下一行的注釋中。
對比變量的原始值,可以分析如下:
第8行變量a_int用%u、%o和%x 3種格式符輸出的時候沒有錯誤,雖然這3種格式本用來輸出無符號數(shù)。這是因為a_int為正數(shù),以無符號數(shù)來解讀其內(nèi)部表示的時候值不變。
第10行變量b_int用%u、%o和%x 3種格式符輸出的時候出現(xiàn)錯誤,因為b_int為有符號數(shù),以無符號數(shù)來解讀其內(nèi)部表示的時候得到的是不同的值。
第12行將變量a_int以長整型的形式輸出,結(jié)果沒有問題,因為在Win32平臺上int和long兩個數(shù)據(jù)類型是完全相同的。
第14行變量c_uint用%d格式符輸出的時候出現(xiàn)問題,因為%d格式符是按有符號數(shù)輸出,而c_uint的*高為1,被解讀為一個負數(shù)。
第16行變量d_short用%d和%u輸出的時候沒有錯誤。這是因為short型數(shù)據(jù)會被自動提升為int型。實際上,對于short型數(shù)據(jù),既可以用%d、%u也可以用%hd和%hu來輸出。
第20行變量e_long用%hd和%hu輸出的時候存在問題,因為它被當作short類型(2B)來解讀,也就是說,只會考察低位的兩個字節(jié),這兩個字節(jié)的內(nèi)容按照有符號數(shù)來解讀是-2,按照無符號數(shù)來解讀是65534。
上面所用的格式符都是按數(shù)據(jù)的實際長度輸出,為了輸出排列的需要,有時要指定每一個數(shù)據(jù)的輸出寬度和對齊方式。指定輸出寬度和對齊方式需用到兩個附加格式符m和-。附加格式符放在%和格式符之間使用。
m為一正整數(shù),用來指定輸出寬度,如果數(shù)據(jù)的實際寬度比指定輸出寬度小,則補上空格后按指定寬度輸出;如果數(shù)據(jù)的實際寬度比指定輸出寬度大,則按實際寬度輸出。
附加格式符“-”用來說明采用左對齊方式,沒有“-”時默認是右對齊方式。
例3.2整型數(shù)據(jù)按照指定寬度和對齊方式輸出。
1#include
2int main(){
3int a=4, b=45, c=456, d=4567;
4unsigned u=456;
5long l=456;
6printf("a=%3d, b=%3d, c=%3d, d=%3d\\n", a, b, c, d);
7/a=4, b=45, c=456, d=4567/
8printf("a=%-3d, b=%-3d, c=%-3d, d=%-3d\\n", a, b, c, d);
9/a=4, b=45 , c=456, d=4567/
10printf("u=%-5u, u=%5u, l=%-5ld, l=%5ld\\n", u, u, l, l);
11/u=456, u=456, l=456, l=456/
12return 0;
13}
其中,每一個printf語句的輸出結(jié)果顯示在下一行的注釋中。
3.1.4整數(shù)的輸入
可以用scanf函數(shù)來輸入數(shù)據(jù)給整型變量;貞浺幌拢瑂canf函數(shù)調(diào)用的一般形式為: scanf(格式化字符串, 地址列表);
其中,格式化字符串的含義同printf函數(shù)類似,地址列表是由若干個地址組成的列表,可以是變量的地址,或字符串的首地址。
在介紹更多的例子之前,先介紹scanf函數(shù)的原理。
scanf函數(shù)以及其他的標準輸入函數(shù)并不是直接從輸入設備(如鍵盤)讀取數(shù)據(jù),而是從內(nèi)存中的輸入緩沖區(qū)中讀取數(shù)據(jù)。如果scanf函數(shù)要讀取數(shù)據(jù),而內(nèi)存緩沖區(qū)為空,scanf函數(shù)就會被阻塞,等待用戶輸入。用戶輸入數(shù)據(jù)并按回車鍵后,所輸入的內(nèi)容才送到內(nèi)存輸入緩沖區(qū)中。
scanf函數(shù)的*個參數(shù)格式化字符串指示了如何從輸入緩沖區(qū)中讀取數(shù)據(jù)。格式化字符串中可以包含以下內(nèi)容:
格式化字符,由%引導的字符。格式化字符導致scanf讀入若干字符并將其轉(zhuǎn)換為某種類型的數(shù)據(jù),該數(shù)據(jù)會被存入到地址列表中的某一地址。
除%外的非空白字符。一個非空白字符導致scanf讀入一個相同的字符但并不存儲該字符。如果scanf讀不到一個相同的字符,scanf會中斷。
空白字符,包括空格、跳格('\\t')和換行符('\\n')。一個空白字符導致scanf讀入后面連續(xù)的空白符,直到下一個非空白符。
scanf使用的具體格式符與printf中類似,如表3.5所示。表3.5scanf整數(shù)輸入格式符
作用格式字符(%)說明輸入形式d期望讀入一個十進制數(shù)o期望讀入一個八進制數(shù)x期望讀入一個十六進制數(shù)u期望讀入一個無符號數(shù)數(shù)據(jù)類型h期望讀入一個 short型數(shù)據(jù)l期望讀入一個long型數(shù)據(jù)ll期望讀入一個long long型數(shù)據(jù)附加格式符m(正整數(shù))指定輸入數(shù)據(jù)所占的寬度(列數(shù))表示本輸入項在讀入后不賦給相應的變量下面是scanf在使用時需要注意的幾個地方。
(1) 輸入數(shù)據(jù)的格式注意要與scanf格式化字符串的格式一致。例如:
……
你還可能感興趣
我要評論
|