




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄
第0章程序設計概論1
0.1程序與程序設計語言1
0.1.1程序1
0.1.2程序設計語言1
0.2C語言的歷史和發展3
0.3一個簡單程序的誕生3
0.3.1簡單的C語言程序概貌4
0.3.2第一個程序的誕生5
本章小結7
復習題7
第1章C程序設計基礎知識8
1.1變量8
1.1.1有關內存的基礎概念8
1.1.2變量的引入8
1.2常量12
1.2.1字面常量12
1.2.2符號常量14
1.2.3const常量15
1.3算術運算符與算術表達式15
1.3.1運算符概述15
1.3.2算術運算符16
1.3.3算術表達式16
1.4賦值運算符與賦值表達式18
1.4.1簡單賦值運算符18
1.4.2復合算術賦值運算符19
1.4.3賦值運算時的數據類型轉換19
1.5自加、自減、逗號運算符20
1.5.1自力口和自減運算符:++、一20
1.5.2逗號運算符22
1.6位運算23
1.6.1位運算的基本規律23
1.6.2位運算符23
本章小結24
復習題25
第2章簡單C語句26
2.1C語句概述26
2.1.1表達式語句26
2.1.2控制語句26
2.1.3函數調用語句27
2.1.4復合語句27
2.1.5空語句27
2.2輸入輸出的概念28
2.3基本輸入輸出函數28
2.3.1格式化輸出庫函數:printf28
2.3.2格式輸入庫函數:scanf30
2.3.3字符輸入輸出函數32
本章小結33
復習題33
第3章分支結構程序設計34
3.1算法與基本程序結構34
3.1.1算法簡介34
3.1.2算法的表示35
3.1.3基本程序結構37
3.2關系運算和邏輯運算38
3.2.1關系運算38
3.2.2邏輯運算39
3.3if語句40
3.3.1簡單if語句40
3.3.2if~else語句42
3.3.3if語句的嵌套43
3.3.4if語句使用注意事項45
3.4switch語句47
3.5條件運算符49
本章小結50
復習題50
第4章循環結構程序設計51
4.1循環的引入51
4.2for循環51
4.3while循環54
4.4do~while循環55
4.5循環的比較57
4.5.1for語句和while語句57
4.5.2while語句和do~while語句60
4.5.3數值輸入中的問題61
4.6循環嵌套63
4.6.1三重循環求解64
4.6.2縮小窮舉法的搜索范圍65
4.6.3兩重循環解決問題66
4.6.3極限情況:一層循環的求解67
4.7break和continue語句69
4.7.1break語句69
4.7.1continue語句70
4.8應用舉例71
本章小結75
復習題75
第5章函數77
5.1函數的基本概念77
5.2函數的聲明和定義78
5.2.1函數聲明和函數原型78
5.2.2函數定義79
5.2.3函數的參數81
5.2.4函數的返回值與函數類型85
5.3函數的調用87
5.3.1函數調用的方式89
5.3.2函數調用過程機制90
5.3.3函數的嵌套調用92
5.4函數的遞歸95
5.4.1遞歸的基本原理96
5.4.2尾遞歸98
5.4.3遞歸與反向計算100
5.4.4漢諾塔問題:雙重遞歸101
5.4.5遞歸的優缺點104
5.5頭文件的使用104
5.6逐步求精107
本章小結116
復習題117
第6章數組118
6.1一維數組118
6.1.1一維數組的聲明118
6.1.2訪問數組元素120
6.1.3數組的初始化122
6.1.4一維數組應用舉例123
6.2二維數組125
6.2.1二維數組的聲明125
6.2.2訪問二維數組元素126
6.2.3二維數組的初始化126
6.2.4二維數組應用舉例127
6.3數組作為函數參數129
6.3.1數組元素用作函數的實參129
6.3.2數組用作函數的參數130
本章小結134
復習題135
第7章指針137
7.1地址作為數據值137
7.2指針變量138
7.2.1聲明指針變量138
7.2.2有關指針的運算符139
7.2.3指針操作140
7.2.4指針作為函數參數143
7.3數組與指針145
7.3.1通過指針操作數組元素145
7.3.2函數、數組與指針149
7.3.3保護數組內容151
7.3.4多維數組與指針156
7.3.5指向數組的指針159
7.4函數指針163
7.4.1通過函數指針調用函數163
7.4.2函數指針用作函數參數165
7.5動態分配內存168
7.5.1NULL指針和void*類型168
7.5.2動態數組169
7.5.3釋放內存170
本章小結170
復習題171
第8章字符數據處理172
8.1字符型常量和字符串172
8.1.1轉義字符172
8.1.2字符串173
8.2字符型變量174
8.3字符數組175
8.3.1字符數組的初始化175
8.3.2字符串和字符串結束標志176
8.4字符串和指針179
8.4.1字符串的表示形式179
8.4.2字符串指針作函數參數180
8.5字符處理函數181
8.6字符串應用實例184
復習題189
第9章結構190
9.1結構類型說明190
9.2使用結構191
9.2.1結構類型變量191
9.2.2結構變量的引用193
9.2.3結構變量賦初值193
9.3結構和指針194
9.3.1結構數組194
9.3.2指向結構的指針198
9.4結構數據在函數間傳遞203
9.5結構和鏈表204
9.5.1單鏈表204
9.5.2單鏈表結點的刪除207
9.5.3單鏈表的插入208
9.5.4環鏈表*210
復習題212
第10章文件214
10.1文件的打開與關閉214
10.1.1文件類型指針214
10.1.2文件的打開215
10.1.3文件的關閉216
10.2文件的讀寫217
10.2.1讀寫字符217
10.2.2讀寫字符串219
10.2.3格式化的讀寫221
10.2.4成塊讀寫(二進制讀寫)222
10.3隨機讀寫文件225
本章小結227
復習題228
第11章TurboC圖形229
11.1圖形模式的初始化及相關函數229
11.2屏幕顏色設置和清屏231
11.3基本圖形繪制233
11.3.1畫點與位置坐標函數233
11.3.2畫直線、圓、橢圓與多邊形函數234
11.4線條樣式設定235
11.5圖形填充237
11.5.1封閉區間填充函數237
11.5.2設定填充方式237
11.6圖形模式下的文本輸出238
11.7圖形示例239
復習題254
第12章存儲類型255
12.1作用域255
12.1.1代碼塊作用域255
12.1.2函數原型作用域256
12.1.3文件作用域256
12.2鏈接257
12.3存儲期258
12.4存儲類型259
12.4.1自動變量259
12.4.2寄存器變量260
12.4.3具有代碼塊作用域的靜態變量260
12.4.4具有外部鏈接的靜態變量262
12.4.5具有內部鏈接的靜態變量265
12.5存儲類型說明符266
12.6函數的存儲類型268
本章小結269
復習題270
附錄AC語言預處理器272
A.1預處理器命令272
A.2預處理器詞法規則272
A.3定義和替換273
A.3.1對象式宏定義273
A.3.2函數式宏定義274
A.3.3重新掃描宏表達式276
A.3.4取消宏定義與重新定義宏277
A.3.5宏擴展中的優先級錯誤278
A.3.6宏參數的副作用278
A.4文件包含279
A.5條件編譯280
A.5.1#if>#else與#endif命令280
A52#elif命令281
A.5.3#ifdef與#ifndel命令282
A.5.4條件命令中的常量表達式283
A.5.5defined運算符283
A.6顯式的行編號284
A.7雜住指令285
A.8錯誤指令285
附錄B常用函數286
附錄C圖形驅動程序和模式289
第0章程序設計概論
用計算機解決問題包括兩個概念上不同的步驟。首先應該構造一個算法或在解決該問題的
已有算法中選擇一個,這個過程稱為算法設計。第二個步驟是用一種程序設計語言將該算法表
達為程序。剛開始學習程序設計時將算法翻譯成實際的編碼過程會是較為困難的階段。在學習
了更多的有關程序設計的過程后,編碼會很快變得簡單,與此同時,隨著要求解決的問題越來
越復雜,算法設計會變得越來越復雜。所以在學習中要有意識的兼顧這兩個過程。
本章介紹計算機程序設計的基本概念及發展。閱讀本章讀者將了解到程序設計中的一些基
本概念以及了解C語言的概貌。
0.1程序與程序設計語言
軟件是計算機系統中不可缺少的部分。什么是軟件?什么是程序?什么是程序設計語言?
本節將給出解答。
0.1.1程序
什么是軟件?目前還沒有一個精確的定義。但認為軟件就是程序的概念肯定是錯誤的。目
前比較公認的定義是由著名的軟件工程專家B.W.Boehm提出的“軟件是程序以及開發、使用
和維護所需要的所有文檔”,由此可見,程序只是完整軟件產品的一個部分。
什么是程序?國標中規定“計算機程序是按照具體要求產生的適合于計算機處理的指令序
列”。也就是說,程序是計算機可以識別和執行的操作表示的處理步驟。我國頒布的《計算機
軟件保護條例》更加明確提出“計算機程序是指為了得到某種結果而可以由計算機等具有信息
處理能力的裝置執行的代碼化指令序列,或者可被自動地轉換成代碼化指令序列的符號化序
列,或者符號化語句序列”??梢钥闯?,程序既可以指能被計算機直接執行的指令序列(可執
行文件),也可以是我們用程序設計語言編寫的源程序,但源程序不能被計算機直接執行,必
須通過程序設計語言翻譯為可執行的指令序列。
0.1.2程序設計語言
程序是由人來編寫,程序的執行實際上反映了人的設計思想。隨著計算機技術的不斷發展,
“編程”技術也在不斷地發展,程序設計語言經歷了幾個不同的階段。
1.機器語言
眾所周知I,數據是以二進制形式存儲在計算機中,我們所能感知的聲音或圖像進入計算機
之前必須要經過編碼轉化為二進制。計算機能夠執行的程序也不例外,也是以二進制代碼表示
指令序列。機器語言便是以二進制代碼表示機器指令的一種語言,用機器語言寫的程序能被計
算機直接執行。
最早的計算機(如ENIAC)便是采用機器語言來編寫程序,“程序員”采用手工撥鈕開關
和紙帶打孔的方式向計算機輸入程序,那時的程序員都是一流的科學家。下面的程序段便是使
用x86計算機的機器語言編寫的,功能是計算1+1。
【例0.1】使用機器語言計算1+1。
10111000
00000001
00000000
00000101
00000001
00000000
很明顯,用這樣的方式編寫程序非常麻煩,人類很難讀懂,而且不同的計算機提供的機器
語言不同,編寫的代碼很難通用。于是匯編語言應運而生。
2.匯編語言
為了解決機器語言編程的困難,人們專門編寫一種稱為程序設計語言的程序,它提供一套
語言規范,程序員可以采用該語言編寫“程序”,然后由程序設計語言將“程序”翻譯為計算
機能夠執行的程序。匯編語言便是最早的程序設計語言之一,用匯編語言編寫1+1的代碼如
例0.2所示。
【例0.1]使用匯編語言計算1+10
MOVAX,1
ADDAX,1
上面的兩行符號,計算機并不能直接執行,需要借助匯編編譯器將它翻譯成例0.1所示的
二進制機器代碼。匯編語言屏蔽了枯燥的二進制代碼,匯編語言用人類易懂的符號代替二進制
代碼,使得編程技術前進了一大步。但匯編語言與機器語言比較接近,多數符號基本上和一組
二進制指令碼直接對應,與計算機內部實現細節直接相關,編程的難度仍然較大。各種新的程
序設計語言不斷誕生發展,人們習慣把機器語言和匯編語言稱為低級語言,而把之后的程序設
計語言稱為高級語言。
3.高級語言
高級語言的出現是編程語言的一大進步,它屏蔽了機器的細節,語言更接近于自然語言和
數學語言,給編程帶來了極大的方便。據不完全統計,目前已經有超過2500種計算機語言,
絕大多數是高級語言。利用C語言計算1+1的代碼如例0.3所示。
【例0.3]使用C語言計算1+1
#inlcude<stdio.h>
main()
printf(''%d\nz\1+1);
)
也許你還不懂這些符號和單詞,但很快就會學會這些內容。高級語言易學、易用、強大,
具有一定的通用性。在例0.3中,如果想讓計算機計算20-4,你可能已經猜到,將程序中的
printf("%d\n”,1+1);更改為printf("%d\n”,20-4);就這么簡單。回過頭來,如果要用機器語言或匯
編語言來計算20-4,恐怕你就不容易猜到了。
0.2C語言的歷史和發展
高級語言門類繁多,c語言是其中影響最大、壽命最長的語言之一。本書便是教授大家利
用C語言編寫計算機程序的。C語言的應用非常廣泛,普通計算機使用的Windows操作系統
基本上是用C語言編寫的,用來進行文檔處理的Word、Excel也是基本上用C編寫的。C語
言同時具有高級語言和低級語言的特點,因此也被稱為“中級”語言,使得C語言具有其它
語言無法相比的速度優勢和靈活性,C的語法規則簡單、靈活,使得它屏蔽了匯編語言復雜、
難以調試等缺點。下面介紹C語言產生發展的簡單歷史。
20世紀60年代,貝爾實驗室(BellLaboratoi-y)的KenThompson開始用匯編語言開發
UNIX操作系統,當程序規模不斷擴大時,他開始無法忍受匯編語言的難寫、難讀和難以維護,
便開始在BCPL程序設計語言的基礎上,將其改造成B語言,使得B語言更適合于開發UNIXo
1971年,DennisM.Ritchie開始和Thompson合作開發UNIX,M.Ritchie主要負責改進B語言,
后來便被命名為C語言。
1973年C語言基本完成,Thompson和Ritchie用C語言重寫了UNIX系統,UNIX操作
獲得了巨大的成功,C語言也因此獲得廣泛的應用。
C語言本身也在不斷發展,1989年,美國國家標準局(ANSI:AmericanNationalStandards
Institute)發布了一個完整的C語言標準,被稱為C89或ANSIC。1990年,國際標準化組織
(ISO:InternationOrganizatonforStandardization)直接采用了C89,有的資料上稱為C90,實
際上C90和C89完全一樣。1999年,ISO發布了最新的C語言規范,被稱為C99,是目前C
語言標準的最高版本。
目前,有許多新程序設計語言正在興起,如C++、Java、C#等,它們借助面向對象程序設
計思想,大大提高了開發效率,獲得了程序員們的認可,稱為程序設計語言中的三大主流陣營。
在這樣的形勢下,仍然有一些程序員們在堅守C語言的陣營,他們追求著C語言的運行高效
率和靈活性。
0.3一個簡單程序的誕生
在正式學習c語言編程規則之前,首先感受一下完整的c程序的的概貌,以及程序設計
語言的工作過程。
0.3.1簡單的C語言程序概貌
下面的示例c程序,完成計算兩個整數中的最大值功能。
【例0.4】計算兩個整數的最大值
#include<stdio.h>
/*GetMax函數求兩個整數中的最大值,兩個參數類型為整型函數返回值類型為整數*/
intGetMax(inta,intb)
{
if(a>b)/*如果a比b的值大,則返回a*/
returna;
returnb;
)
voidmain()
(
intx,y,max;
printf(''Pleaseinputtwointegers:'');
scanf("%d%d〃,&x,&y);/*通過鍵盤輸入兩個整數*/
max=GetMax(x,y);/*求x、y中的最大值保存到max中*/
printf(''Themaxnumberis:%d\n”,max);
}
例0.4就是一個簡單但完整的C語言程序,現在你可能還讀不懂其中每個符號所代表的含
義,沒關系,先對程序有一個輪廓的認識。運行程序時,屏幕上將顯示一條提示信息:
Pleaseinputtwointegers:
要求用戶通過鍵盤輸入兩個整數。假設用戶輸入33和-4,即
Pleaseinputtwointegers:33-4/
符號/表示按下回車鍵,33和-4之間空一個空格,也可以每輸入一個數后按一下回車(以
后的示例均如此表示),輸入后屏幕的提示結果為:
Themaxnumberis:33
1.C語言程序由函數構成
函數(Function)是構成C語言程序的基本單位,例0.4由GetMax和main兩個函數構成。
每個函數由函數首部和函數體構成,GetMax的函數首部為"intGetMax(inta,intb)”,main函
數的函數首部為“voidmain。";函數體便是函數首部之后的一對花括號“{}”之間的內容。
具體的有關函數的知識請參照第五章內容。
每個程序中有且只能有一個main函數,這個函數稱為主函數,程序執行時,便從這個函
數體“對應”的第一條指令開始執行。一個C程序中可以包含多個自定義函數,也可以一個
沒有,示例0.4中的GelMax函數便是自定義函數,main以外的函數均是自定義函數。
2.對庫函數的引用
編程時,如果所有的函數都要程序員自己編寫,那工作效率一定很低,對于一些通用的功
能,多數編譯器均提供了一組標準庫函數。庫函數的使用極大提高了編程效率,程序員可以在
自己的程序中調用庫函數。
要調用系統提供的庫函數,必須在程序中包含相應的頭文件(Headerfiles),包含頭文件
要用到編譯預處理指令,示例0.4中所用的為:
#include<stdio.h>
stdio.h是最常用的需要包含的頭文件,一般程序中均要包含這一頭文件。要將計算結果輸
出的屏幕上,需要調用庫函數中的printf函數,從鍵盤讓用戶輸入數據,需要調用庫函數中的
scanf函數,它們都需要包含stdio.h;如果要調用數學函數,如計算正弦函數值的sin函數,則
要包含math.h(具體格式為:#include<math.h>)o
通常情況下,將頭文件包含放在程序的最開始處。
3.培養良好的書寫習慣
C程序的函數體部分由語句構成,語句都是以分號作為結束符(反過來不成立,出現分號
的地方不一定是一條語句的結束),編譯預處理指令(如頭文件包含)不是C語句,所以不能
在最后加分號,函數的定義前后也不能加分號。
C的語句書寫格式比較規范,可以在一行內書寫多條語句,也可以將一條語句分開寫在多
行上。但為了保證程序的可讀性和調試改錯的方便,應該養成良好的代碼書寫規范和習慣。一
般情況下,一行內只寫一條語句,代碼結構清楚,錯落有致,希望大家在上機實踐的時候,仿
照書中的例題來書寫程序,養成良好的習慣。
4.注釋也很重要
在例0.4中,/*和*/之間的內容便是注釋,注釋是程序員對自己所編寫程序的注釋性說明,
可以采用中文也可以用英文,但一定要放在/*和*/之間,而且/和*之間不能有空格。編譯器在
將程序翻譯為機器語言代碼時,忽略所有的注釋內容,也就是說注釋對程序功能沒有任何影響。
但注釋卻是編寫程序時不可缺少的內容,清晰的注釋記錄了程序員編寫程序時的思路和設計思
想,便于其他程序員或自己事后再來閱讀這一段程序。規范化的程序設計提倡給程序加上必要
的注釋。
C語言的注釋可以有兩種方式,上述是第一種方式,放在/*和*/之間,中間可以換行,也
就是說可以有較多的注釋說明。另一種方式最早是C++語言引入的,目前大多數C編譯器已
經支持,ANSIC標準也已經引入,也稱為行注釋,用〃引導,//之后到該行結束所有內容
都是注釋。如:
scanf(''%d%d,z,&x,&y);//通過鍵盤輸入兩個整數
本教材中,根據需要兩種注釋都使用。
0.3.2第一個程序的誕生
用高級語言編寫的程序,計算機并不能直接運行,必須要借助編譯程序將我們編寫的代碼
翻譯為用。和1表示的機器語言指令代碼,才能真正在計算機中執行。用c語言開發軟件都
要經歷“編輯f編譯f鏈接f運行”的過程。
1.編輯源代碼
編輯階段就是利用c語言編寫實現特定功能的程序代碼,通常將這一階段的代碼稱為源
代碼(SourceCode),源代碼必須遵循高級語言的規范,同時也人的智慧與思維的體現。本書
的其余章節都是講解如何寫好C語言源代碼。
一般將編寫好的C語言源代碼保存為文本文件,擴展名為.c,如例0.4的代碼我們可以保
存為findmax.c?
2.編譯(Compile)
編譯由編譯器負責完成,編譯器是一個事先開發好的軟件,它專門用于將我們編寫的源代
碼翻譯為計算機能夠理解的二進制目標代碼。能將C語言源代碼翻譯為二進制碼的的編譯器
有很多,常用的有TurboC、MicrosoftCsBorlandC等。編譯器是一種非常復雜的軟件,不同
的編譯器在翻譯代碼時的策略也不完全相同,同樣的代碼經不同的編譯器翻譯后的可執行文件
并不完全相同,所以在真正開始軟件開發時,首先要了解自己所選擇的編譯器。本書選用Turbo
C作為編譯器,有關TurboC的操作請參照附錄的說明。
在編譯階段,編譯器通常會發現源代碼中不符合語言規范的語法錯誤,程序員需要修訂這
些錯誤并重新編譯直到編譯成功。如果你輸入的findmax.c沒有語法錯誤,編譯后將生成
findmax.obj,我們稱之為目標文件。
3.鏈接(Link)
程序中除了自己編寫的代碼外,往往還需要調用庫函數中提供的函數或者其他人編寫目標
函數,鏈接過程便是將這些目標函數合并成有關完整的可執行文件。對于例04的findmax.c,
將生成findmax.exe,findmax.exe便可以在計算機上直接運行。
目前大多數編譯器都提供了集成的開發環境(IDE:IntegratedDevelopmentEnviroment),
只要點擊一下菜單,便可以連續完成編譯、鏈接過程(編譯出錯則不能完成鏈接),最后生成
一個可執行文件,一般不會覺察到鏈接過程的存在。
4.運行
鏈接成功后得到的便是一個可執行程序,可執行程序便可以復制給別人去執行應用??蓤?/p>
行程序生成后便和源代碼脫離關系,可執行程序的執行并不需要源代碼的存在。很多初學C
語言程序設計的人,總是認為是自己編寫的源代碼再執行(一點TurboC中的Run菜單項,程
序便執行),實際上應該是你編寫的源代碼被編譯器翻譯成的可執行程序在運行,當運行有錯
誤時,重新修改代碼,重新翻譯,重新運行。
程序在運行時,將二進制指令代碼和要處理的數據加載到內存中才能執行,要想了解可執
行文件的加載過程還需要進一步的學習,而源代碼只是存儲在磁盤上的一個普通文件。由此可
見,真正執行的不是源代碼,而是編譯鏈接結果加載到內存后的二進制代碼。
5.小結:程序員、編譯器、測試人員、用戶
在軟件開發過程中,有非常重要的四個角色:程序員、編譯器、測試人員和用戶。程序員
是C語言源代碼的撰寫者,根據功能需求,按C語言語言規范編寫源代碼。源代碼需要借助
編譯器進行翻譯,我們需要購買一個C語言編譯器(如TurboC)安裝到自己的機器上,執行
編譯器提供的翻譯功能,生成一個可執行程序。生成的可執行程序需要經過測試人員進行運行
測試。測試無誤后,將軟件打包分發、銷售給廣大用戶使用,用戶是軟件的使用者和收益者,
用戶通過軟件解決實際的問題。
當然在學習C語言編程的時候,我們既是程序員,同時也是測試人員和用戶,但我們不
能混淆這幾個截然不同的角色。編寫源代碼時我們是程序員;編譯時需要借助編譯軟件完成;
程序編寫完成后要反復運行,查看有無功能上的缺陷或錯誤,此時我們便是測試員和用戶。程
序員、測試員和用戶應該是在不同的環境和場合下編寫或程序,但在實際學習時,多個環節幾
乎都是在同一臺機器的TurboC環境下完成的,容易造成錯覺。
大家在編寫程序時,要養成良好的編碼習慣,編寫的程序要界面友好,輸入輸出要有提示
說明,用戶輸入錯誤要有檢測和提示。你編寫的程序不一定只是你在運行,你的成果可能會拷
貝到別人的機器上執行,如果在輸入數據時沒有提示,用戶很難知道程序到底要干什么?在例
0.4中,在要求用戶輸入兩個整數之前,通過printf("Pleaseinputtwointegers:");向屏幕上打印
一行提示,非常直觀,在上機實踐時一定要遵循這一編碼習慣。
本章小結
C語言是目前應用比較廣泛的編程語言之一,本章簡單介紹了程序及程序設計語言的基本
概念,介紹了C程序設計語言的發展歷史。
C語言編寫的源程序不能被計算機直接執行,必須借助編譯器將源代碼編譯鏈接為可執行
程序,才能被計算機識別執行。通過一個簡單的示例,展現C語言源代碼的概貌和編寫C程
序的基本流程。
復習題
1、指令、程序和軟件有什么區別?
2、機器語言、匯編語言、高級語言各有什么特點?
3、簡述C語言編程的基本過程。
4、筒述C程序的基本結構。
5、程序員、編譯器、測試人員、用戶在軟件開發過程中各自的職責是什么?
第1章C程序設計基礎知識
程序的最后執行需要將可執行代碼及待處理的數據加載到內存中,計算機內存中要為可執
行代碼留出保存空間,還要為待處理的數據留出相應的空間,很多場合下,要處理的數據占用
的空間要比可執行代碼占用的空間要多?,F實生活中有自然數、整數、小數等概念,不同類型
數的精度是不一樣的。在計算機內存中,也要區分所保存數據的類型,如整數、浮點數、字符
數據等,不同類型數據所占用的內存空間(即占用的字節數)是不一樣的。
大多數高級語言在源代碼中都要用聲明語句對程序中將要處理的數據進行變量定義,其目
的就是為不同類型的數據開辟不同的存儲空間,便于進行處理與存儲。
本章從數據基本類型開始,介紹變量定義、基本運算符及表達式語法,是C語言編程中
的基礎知識。
1.1變量
C語言的數據類型比較豐富,整體上可劃分為基本類型、構造類型以及空類型,基本類型
包括整型、浮點型(進一步區分為單精度和雙精度類型)、字符型、枚舉類型和指針類型,構
造類型有數組、結構體和共用體。本節將重點討論最基本的整型數和實型數以及定義整型和實
型變量的定義方法。
1.1.1有關內存的基礎概念
內存由能存儲信息的介質組成,它們劃分為眾多的存儲單元,每個存儲單元可以存儲一個
字節或8個二進制位,可以將存儲單元理解為由8個微小開關構成,每個開關可以表示一個二
進制位,將指令和數據送入存儲器,只不過是打開一些開關而合上另外一些開關。內存包含眾
多的存儲單元,為了識別它們,從0開始順序為它們編號,編號稱為某個存儲單元的地址,表
示這一存儲單元在內存中的位置(很多時候用相對位置的概念)。存儲單元的地址反映的是位
置信息,存儲單元的內容是8個二進制數。
磁盤、光盤、CPU中的寄存器等存儲器的基本原理與內存相似,只不過各自的存儲介質
不同而已。
1.1.2變量的引入
程序運行過程中,經常需要保存用戶輸入的數據、計算的中間結果以及最終計算結果,因
此在c語言中引入了變量的概念,用來存放值可以變化的數據。顧名思義,變量對應的數據
可以被讀出來參與計算,也可以將計算結果寫入某個變量對應的存儲空間。
C語言中每個變量要具備3個要素:變量的名稱、變量的數據類型、變量的值。
1.標識符命名規則
C程序中經常要為函數、變量等起一個符號化的名稱,這些符號稱為標識符,標識符的命
名必須遵循一定的規則。
(1)標識符只能由英文的字母、數字和下劃線構成,標識符不能以數字打頭,第一個
字符只能是字母或下劃線。
(2)C語言的關鍵字不能作為標識符,C語言總共有32個關鍵字,見表1-1。需要注
意的是,不同的C編譯器,支持的關鍵字略有不同。
(3)C語言中的標識符區分大小寫,如Sum和sum是兩個不同的標識符。
(4)在C語言中,標識符長度可以不受限制,但舊的ANSIC規定,只有前6個字符
有意義,也就是說編譯器只看標識符的前6個字符,新的C和C++編譯器打破了
這一限制,但不同的編譯器還是有一個長度限制。
(5)標識符命名要養成良好的習慣和一致的風格,盡量做到“見名知義”,尤其當程序
代碼增多時,不好的標識符命名將使得代碼難以閱讀,也很難維護。這一條不是
硬性規定,但應該從一開始就要養成良好的習慣。
表1-1C語言的關鍵字表
autobreakcasecharconstcontinuedefault
dodoubleelseenumexternfloatfor
gotoifintlongregisterreturnshort
signedsizeofstaticstructswitchtypedefunion
unsignedvoidvolatilewhile
2.變量的名字
變量的名字可以根據需要由程序員指定,除了要遵循標識符的規定,還應該注意以下的規
則。
(1)在同一個函數體內,不要定義同名的兩個變量。在TurboC中,所有變量的定義
語句必須放在函數體的最開始處,變量定義要遵循“先定義后使用”的原則,否
則會出現編譯錯誤。
(2)盡量避免定義與庫函數中函數名同名的變量,如printf、scanf等,雖然不會出現
語法錯誤,但容易造成混亂。
下面的變量名是合法的變量名:total_money、_MyCar、AverageScore、class_l,也是比較
好的變量命名,變量名中最好用英文單詞表達變量的含義,有的系統推薦使用下劃線分隔單詞,
有的推薦使用單詞首字母大寫來區分,盡量使用統一的風格,避免多種方法混雜在一起。下面
的變量命名雖然合法,卻不是很好的命名習慣:al、a2、xyz等。而下面的變量命名則是不合
法的:l_class、total+moneny、My=Car、into
3.變量的定義方法
變量定義的基本語法格式為:
變量類型變量名列表;
其中變量類型確定了變量所要存儲數據的類型,如整型、實型等,變量名列表列出多個需
要定義的變量的名稱(也可以一次只定義一個變量),變量名之間用逗號(一定不要使用中文
逗號)分隔。
【例1.1]變量的定義
intenglish_score;
intmath_scoreztotal_score;
doubleaverage_score;
float_height;
char_myChar;
定義整型變量使用關鍵詞ini,定義單精度實數用關鍵詞float,定義雙精度實數使用關鍵
字double,double類型數據比float類型數據有更高的存儲精度。在這些基本類型關鍵詞之前,
還可以加一些修飾符,如short、long、signed、unsigned等,以確定更加具體的類型,具體的
用法稍后再介紹。
變量定義的同時還可以為變量指定初始值,如inta=5;。
4.變量與存儲單元的探討
程序員在源代碼中定義的變量,是程序設計語言中特有的概念,經編譯器編譯生成的可執
行程序加載到內存中時,并沒有變量的概念,變量名被編譯器翻譯為某個存儲單元的“地址”,
即它在內存中的位置。回顧一下例0.4中求兩個整數中的最大值的程序,用戶通過鍵盤輸入兩
個整數,兩個整數存儲在內存中某些存儲單元,之后需要引用這兩個整數的值,在程序的運行
階段,是通過指定數據在內存中的位置來進行訪問的,這個位置由編譯器和系統加載可執行程
序時共同確定。而程序員在編寫源代碼的時候,很難知道數據將來會放在內存的什么地方,為
了屏蔽這一細節,我們用定義變量的方式來解決這一問題,定義的變量將來會放在內存的什么
地方這一復雜問題交由編譯器來解決。由此必須明確,變量是為了編程的方便而提出的概念,
我們只需通過變量名即可引用變量將來所對應存儲單元的值,作為編程人員,可以簡單地將變
量和其將來所對應的存儲單元等同起來。
5.變量類型與占用的存儲空間
定義變量需要指定變量的類型,變量的類型決定了在加載可執行程序時,系統將要為它在
內存中開辟多少個字節的存儲空間,這一工作由編譯器和操作系統聯合完成。同樣當需要訪問
變量所對應的數據時,系統將根據變量的類型從某個位置開始(變量編譯后的地址),連續取
若干個字節的內容并解釋為該類型的數據。通俗地講,變量對應的是一組存儲單元,變量的值
是這些存儲單元中的二進制位組成的數。
不同的系統、不同的編譯器中,某種數據類型占用的存儲空間并不一樣。表1-2以TurboC
和常見的x86為例,列出常用的整型、實型和字符型變量類型將占用的存儲空間,若讀者使用
不同的開發環境,請參照具體的文檔說明。
表1-2不同類型數據占用存儲空間情況
占用
類型說明取值范圍備注
字節數
int整型2-32768?32767-2,5~(2,5-1)
signed帶符號整型,與int等價
shortint短整型,與int等價
short短整型,與int等價
singnedshortint帶符號短整型,與int等價
unsignedint無符號整型20?655350~(216-l)
unsignedshortint無符號短整型,與無符號整型等價
longint長整型4-2147483648?2147483647.23l~(23l-l)
long長整型,與longint等價
signedlongint帶符號長整型,與longint等價
unsignedlongint無符號長整型4。?42949672950~(232-l)
float單精度型4-3.4X1038~3.4X10387位有效位
double雙精度型8-1.7X10308~1.7X1030815位有效位
longdouble長雙精度型10-3.4X104932~3.4X10493219位有效位
char字符型1-128-127-27~(27-1)
signedchar帶符號字符型,與char等價
unsignedchar無符號字符型10-2550~(28-1)
關于不同類型數據占用存儲空間的幾點說明:
(1)signed(帶符號型)和unsigned只能修飾char和int型,因為double和float型必
須為帶符號型,不能再修飾。char和int型默認情況下就是signed類型,可以說
signed關鍵詞總是可以省略。
(2)short只能修飾int型,在TurboC中,short修飾符也總是可以省略的。
(3)long可以用來修飾ini和double,longint用來表示更多位數的整數,longdouble
表示精度更高的雙精度實數。單很多編譯器并沒有實現longdouble數據類型。
(4)int型占用存儲空間在不同編譯器之間變化是最為無常的,在實際編程時,雖然可
以省略諸如short之類的修飾符,但最好加上,以增加程序的可移植性。
(5)char型變量用于存儲一個西文字符。但讀者要注意,char變量中存儲的是對應字
符的ASCII碼。
(6)某種類型的數據所能表示的數值范圍是一定的,如血型變量占兩個字節(16位
二進制),最高位為符號位,所能表示的整數范圍為-32768~32767,如果將大于
32767或小于-32768的整數賦值給某個整型變量,則會發生錯誤,稱為溢出。例
1.2展現了整型變量的溢出。
【例1.2】整型變量的溢出
#include<stdio.h>
voidmain()
unsignedintbad_int;
bad_int=65536;
printf(''Theresultis:%d\n”,bad_int);
程序的輸出結果為:TheresultisOcbad_int是無符號類型,所以65535在內存中的表示形
式如圖1-1所示。
1111111111111111
圖1-165535在內存中的示意圖
0000000000000000
圖1-20在內存中的示意圖
當將65535加1變為65536時,內存中的存儲形式變為圖1-2所示,它正好是0的存儲形
式。int型變量的表示范圍為0~65535,在所能表示的最大數基礎上加1,該變量就變為可表示
范圍內的最小值,這一點非常類似鐘表的鐘點,過了12點,便又從0點開始?
數據在內存中均以補碼的形式存儲,無符號數的原碼與反碼相同,只能表示正數。對于帶
符號數,表示整數的16位二進制中的最高位為符號位,1表示負數,0表示整數,數據同樣以
補碼的形式存儲,帶符號整型數的取值范圍為-32768~32767,32768按整數輸出將輸出-32768。
具體的驗證過程,請讀者自行完成。
所以在程序設計過程中,應充分考慮數據的變化范圍,以選擇合適的數據類型來存儲數據,
避免由于溢出而導致的程序運行錯誤,這一類錯誤是很難被發現的。
1.2常量
程序中除了需要定義變量用于開辟存儲空間、存儲數據,我們還需要一些在程序運行過程
中保持不變的數據,如圓周率3.1415926、稅率、萬有引力常數等等,常量也有數據類型,常
量的類型也決定了該常數占用的存儲空間。
常量可區分為字面常量、符號常量和const常量,字面常量是程序代碼中直接書寫的數值,
經編譯后被嵌入在代碼中,稱為立即數,程序運行時直接參與運算;符號常量與字面常量類似,
但有一個易于理解的符號名稱;const常量與變量類似,程序加載時,需要為const常量開辟存
儲空間,const常量有特定的數據類型,有符號化的名稱,只是在程序運行過程中,常量的值
不能被修改。
1.2.1字面常量
在書寫源程序時,經常要直接書寫數值常量,本節重點介紹不同類型字面常量的書寫規范
和格式。
1.整型常量
在C語言中可以用十進制、八進制或十六進制書寫整型常量。
(1)默認方式為十進制,可以包含0~9的數字以及表示負數的號,不能以0開頭。
如0、128、-23等。
(2)八進制整型常量,在正常數值前加上0作為前綴,數字由0~7構成,如012(相
當于十進制的10)、-048(相當于十進制的-40)。
(3)十六進制整型常量,在正常數值前加上Ox或0X作為前綴,數字由0~9、A~F、
a~f構成,如0x12(表示十進制的18)、-0X7B(表示十進制的-123)。
(4)整型常量默認的類型為int型,如果要表示長整型整數常量,可以在正常數字后加
一大寫或小寫的L作后綴,如129L、1391、0x7AL等。
(5)默認情況下,整型常量為帶符號常量,如果要表示無符號整型常量,可以在數據
后面加上大寫或小寫的U作為后綴。如123u、3456UL等。
2.實型常量
實型常量只能用十進制表示,有小數方式和指數方式兩種表示方法。
(1)小數方式,與正常書寫的小數類似,如3.1415、2、.345、0.0等。
(2)指數方式,由小數部分、代表指數的e或E、指數三部分構成,指數為帶符號整
數,E或e之前必須有數字。合法的科學表示小數有1.23456E4、12.3456e3,它
們均表示十進制的12345.6。而1.2e2.3、.e2、E4均不是合法的常量。
(3)默認情況下,實型常量為雙精度類型,在實型常量之后加上F或f作為后綴表示
數據類型為單精度類型,在實型常量之后加上L或1作為后綴表示數據類型為長
雙精度類型,但這一類型在很多編譯器中并未實現。
3.字符常量
C語言中的字符常量是由一對單引號括起來的一個字符,如,A,,,鏟等。字符常量兩
側的單引號是必須的,注意5和5兩個不同的對象,’5,表示字符5,而5表示整數的數字5,
請讀者不要混淆。
大多數字符常量都可以通過加單引號的方式表示,但有些特殊字符,如單
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《稅收合規性補充申報智能管理系統》介紹課件
- 計算機一級試題及參考答案解析
- 5月消防設施操作員試題(含參考答案)解析
- 毛織造企業組織結構與人力資源管理考核試卷
- 班主任家長會課件下載
- 紙容器生產過程中的能耗監測與優化考核試卷
- 2025年印刷品、記錄媒介復制品項目合作計劃書
- 空調器智能濕度控制系統考核試卷
- 《秋天的落葉》課件
- 網絡安全防護在智慧城市的智能垃圾分類系統中評估考核試卷
- 贍養老人個稅扣除分攤協議書
- 2025年度江西撫州高新區區屬國企業公開招聘紀檢監察工作人員10人高頻重點模擬試卷提升(共500題附帶答案詳解)
- 北京市歷年中考語文現代文閱讀之非連續性文本閱讀8篇(截至2024年)
- 糧油配送項目服務承諾及售后服務
- 公司內部文件管理規定及辦法
- 2024-2025中國服裝行業科技創新白皮書
- 道路安全交通課課件
- 眼科住院及手術患者安全
- 數字化轉型對企業人力資本的影響研究
- 保密基本知識培訓材料范文
- 公開征集招標代理機構投標方案(技術方案)
評論
0/150
提交評論