




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
內(nèi)容簡(jiǎn)介
本書以程序設(shè)計(jì)過(guò)程為主線,以問(wèn)題和案例引入內(nèi)容,圍繞問(wèn)題的解決來(lái)講解C語(yǔ)
言及程序設(shè)計(jì)。全書共分13章,主要內(nèi)容包括:引言、簡(jiǎn)單C程序設(shè)計(jì)、分支結(jié)構(gòu)、循
環(huán)結(jié)構(gòu)、函數(shù)、數(shù)組、字符數(shù)組與字符串、指針、結(jié)構(gòu)、指針進(jìn)階、C預(yù)處理、文件及
計(jì)算思維與常用算法。
本書內(nèi)容全面,知識(shí)點(diǎn)詳盡,適合作為高等學(xué)校各專業(yè)C語(yǔ)言程序設(shè)計(jì)課程的教
材,也可作為從事計(jì)算機(jī)相關(guān)工作的人員的參考書。
圖書在版編目(CIP)數(shù)據(jù)
C語(yǔ)言程序設(shè)計(jì)/甘勇,李曄,盧冰編著.—2版.—北京:
中國(guó)鐵道出版社,2015.9
教育部大學(xué)計(jì)算機(jī)課程改革規(guī)劃教材
ISBN978-7-113-20707-6
Ⅰ.①C…Ⅱ.①甘…②李…③盧…Ⅲ.①C語(yǔ)言-
程序設(shè)計(jì)-高等學(xué)校-教材Ⅳ.①TP312
中國(guó)版本圖書館CIP數(shù)據(jù)核字(2015)第195860號(hào)
書名:C語(yǔ)言程序設(shè)計(jì)(第二版)
作者:甘勇?李曄?盧冰?編著
策劃:周?欣?祝和誼讀者熱線:400-668-0820
責(zé)任編輯:周?欣
編輯助理:祝和誼
封面設(shè)計(jì):一克米工作室
責(zé)任校對(duì):湯淑梅
責(zé)任印制:李佳
出版發(fā)行:中國(guó)鐵道出版社(100054,北京市西城區(qū)右安門西街8號(hào))
網(wǎng)址:
印刷:北京市昌平百善印刷廠
版次:2014年9月第1版2015年9月第2版2015年9月第1次印刷
開(kāi)本:787mm×1092mm1/16印張:22.75字?jǐn)?shù):534千
書號(hào):ISBN978-7-113-20707-6
定價(jià):43.00元
版權(quán)所有侵權(quán)必究
凡購(gòu)買鐵道版圖書,如有印制質(zhì)量問(wèn)題,請(qǐng)與本社教材圖書營(yíng)銷部聯(lián)系調(diào)換。電話:(010)63550836
打擊盜版舉報(bào)電話:(010)51873659
第1章引言
●計(jì)算機(jī)與程序設(shè)計(jì)語(yǔ)言
●C語(yǔ)言的起源與發(fā)展
●C語(yǔ)言的特點(diǎn)
●一個(gè)簡(jiǎn)單的C語(yǔ)言程序
“C語(yǔ)言”在程序設(shè)計(jì)語(yǔ)言中是個(gè)閃亮的名字,每個(gè)學(xué)習(xí)計(jì)算機(jī)及相關(guān)專業(yè)的人在學(xué)習(xí)程
序設(shè)計(jì)語(yǔ)言時(shí)都會(huì)首先關(guān)注它。學(xué)習(xí)C語(yǔ)言,具有挑戰(zhàn)性卻有著高回報(bào),這在我們學(xué)習(xí)和使
用過(guò)程中會(huì)有深刻體會(huì)。C語(yǔ)言是20世紀(jì)70年代初在貝爾實(shí)驗(yàn)室開(kāi)發(fā)出來(lái)的一種廣為使用
的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,它從誕生起就主宰整個(gè)軟件行業(yè),從來(lái)沒(méi)有遇到過(guò)挑戰(zhàn),也從來(lái)沒(méi)
有離開(kāi)過(guò),甚至被稱為編程語(yǔ)言的萬(wàn)王之王。但是,C語(yǔ)言究竟有哪些特別之處?為什么國(guó)
內(nèi)外大部分高校都把C語(yǔ)言作為程序設(shè)計(jì)入門語(yǔ)言?讓我們?cè)趯?duì)計(jì)算機(jī)與程序設(shè)計(jì)語(yǔ)言的誕
生、C語(yǔ)言的起源、特點(diǎn)及其幾十年來(lái)的發(fā)展的介紹中尋找答案吧。
C語(yǔ)言程序設(shè)計(jì)(第二版)
1.1計(jì)算機(jī)與程序設(shè)計(jì)語(yǔ)言
計(jì)算機(jī)是能夠進(jìn)行計(jì)算和邏輯判斷的電子設(shè)備,2014年6月,TOP500組織公布了最新
全球超級(jí)計(jì)算機(jī)500強(qiáng)排行榜榜單,中國(guó)國(guó)防科技大學(xué)研制的“天河二號(hào)”超級(jí)計(jì)算機(jī),再
次位居榜首,其峰值計(jì)算速度為每秒5.49億億次,持續(xù)計(jì)算速度每秒3.39億億次雙精度浮
點(diǎn)運(yùn)算,相當(dāng)于地球上每個(gè)人同時(shí)執(zhí)行幾百萬(wàn)次運(yùn)算。
計(jì)算機(jī)在被稱為計(jì)算機(jī)程序的機(jī)器指令序列的控制下對(duì)數(shù)據(jù)進(jìn)行處理。而計(jì)算機(jī)程序中
的指令序列是由被稱為計(jì)算機(jī)程序員的人事先制定好的。本書將帶領(lǐng)讀者探索如何編寫計(jì)算
機(jī)程序,命令計(jì)算機(jī)實(shí)現(xiàn)特定功能。
1.1.1程序存儲(chǔ)思想
“程序”一詞來(lái)自于生活,通常指完成某件事務(wù)的一種既定方式和過(guò)程。在日常生活中,
可以將程序看成是一系列動(dòng)作執(zhí)行過(guò)程的描述。而計(jì)算機(jī)程序是人們?yōu)榱俗層?jì)算機(jī)解決某個(gè)
問(wèn)題而編寫的一系列有序指令的集合。
馮·諾依曼最先提出了在數(shù)字計(jì)算機(jī)內(nèi)部的存儲(chǔ)器中存放程序的概念,馮·諾依曼理
論的要點(diǎn)是:數(shù)字計(jì)算機(jī)的數(shù)制采用二進(jìn)制,計(jì)算機(jī)應(yīng)該按照程序順序執(zhí)行,這是所有現(xiàn)代
電子計(jì)算機(jī)的理論基礎(chǔ),存儲(chǔ)程序控制原理又稱馮·諾依曼原理。由于他對(duì)現(xiàn)代計(jì)算機(jī)技
術(shù)的突出貢獻(xiàn),馮·諾依曼又被稱為“計(jì)算機(jī)之父”。
計(jì)算機(jī)之所以采用二進(jìn)制編碼,是因?yàn)槎M(jìn)制只有0和1兩個(gè)數(shù)碼??梢员硎?、1兩種
狀態(tài)的電子器件很多,如開(kāi)關(guān)的接通和斷開(kāi)、晶體管的導(dǎo)通和截止、電位電平的高與低等都
可表示0、1兩個(gè)數(shù)碼。早期的程序員們將0、1數(shù)字編程的程序代碼打在紙帶或卡片上,1
打孔,0不打孔,再將程序通過(guò)紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。
存儲(chǔ)程序思想——把計(jì)算過(guò)程描述為由許多指令按一定順序組成的程序,然后把程序和
數(shù)據(jù)一起輸入計(jì)算機(jī),計(jì)算機(jī)便可自動(dòng)地從一條指令轉(zhuǎn)到執(zhí)行另一條指令,對(duì)已存入的程序
和數(shù)據(jù)進(jìn)行處理后,輸出結(jié)果。
為實(shí)現(xiàn)存儲(chǔ)程序思想,計(jì)算機(jī)必須具備五大基本組成部件,包括:
輸入數(shù)據(jù)和程序的輸入設(shè)備;
記憶數(shù)據(jù)和程序的存儲(chǔ)器;
完成數(shù)據(jù)加工處理的運(yùn)算器;
控制程序執(zhí)行的控制器;
輸出處理結(jié)果的輸出設(shè)備。
這是現(xiàn)代計(jì)算機(jī)的模板,被稱為“馮·諾依曼結(jié)構(gòu)”。
2
第1章引言
1.1.2程序設(shè)計(jì)語(yǔ)言的發(fā)展
雖然計(jì)算機(jī)技術(shù)發(fā)展很快,但存儲(chǔ)程序思想至今仍然是計(jì)算機(jī)的基本工作原理。這一原
理決定了人們使用計(jì)算機(jī)的主要方式——編寫程序和運(yùn)行程序??茖W(xué)家們一直致力于提高程
序設(shè)計(jì)的自動(dòng)化水平,改進(jìn)用戶的操作界面,提供各種開(kāi)發(fā)工具、環(huán)境與平臺(tái),都是為了讓
人們更加方便地控制計(jì)算機(jī),可以少編程甚至不編程來(lái)使用計(jì)算機(jī)。
1.機(jī)器語(yǔ)言
計(jì)算機(jī)能夠直接讀懂的語(yǔ)言是機(jī)器語(yǔ)言,機(jī)器語(yǔ)言是直接用二進(jìn)制代碼指令表達(dá)的計(jì)算
機(jī)語(yǔ)言。機(jī)器語(yǔ)言的指令是用0和1組成的一串代碼,它們有一定的位數(shù),并分成若干段,
各段的編碼表示不同的含義。例如,某臺(tái)計(jì)算機(jī)字長(zhǎng)為16位,即由16個(gè)二進(jìn)制數(shù)碼組成一
條指令或其他信息。16個(gè)0和1可組成各種排列組合,通過(guò)線路變成電信號(hào),讓計(jì)算機(jī)執(zhí)行
各種不同的操作。例如,某種計(jì)算機(jī)的指令為1011011000000000,它表示讓計(jì)算機(jī)進(jìn)行一次
加法操作;而指令1011010100000000則表示進(jìn)行一次減法操作。
計(jì)算機(jī)可以直接識(shí)別機(jī)器語(yǔ)言,不需要進(jìn)行任何翻譯。每臺(tái)機(jī)器的指令,其格式和代碼
所代表的含義都是硬性規(guī)定的,機(jī)器語(yǔ)言對(duì)不同型號(hào)的計(jì)算機(jī)來(lái)說(shuō)一般是不同的。由于機(jī)器
碼是用許多二進(jìn)制數(shù)表示的,用機(jī)器語(yǔ)言編程必然很煩瑣、難記憶、易出錯(cuò),非常消耗精力
和時(shí)間,并且難以檢查程序和調(diào)試程序,工作效率低。
2.匯編語(yǔ)言
為了使程序員擺脫機(jī)器語(yǔ)言的束縛,提高編程效率,計(jì)算機(jī)科學(xué)家進(jìn)行了一種改進(jìn):用
一些簡(jiǎn)潔的英文字母、符號(hào)串來(lái)替代一個(gè)特定指令的二進(jìn)制串,例如,用ADD代表加法,SUB
代表減法等。這樣一來(lái),程序變得易于理解,糾錯(cuò)及維護(hù)也變得比較方便,這種程序設(shè)計(jì)語(yǔ)
言被稱為匯編語(yǔ)言。
匯編語(yǔ)言大部分語(yǔ)句直接對(duì)應(yīng)機(jī)器指令,執(zhí)行速度快、效率高、代碼體積小,主要用在
存儲(chǔ)器容量有限但需要快速和實(shí)時(shí)響應(yīng)的場(chǎng)合,如儀器儀表和工業(yè)控制設(shè)備中。
雖然匯編語(yǔ)言較機(jī)器語(yǔ)言已有很大的改進(jìn),但仍是面向機(jī)器的語(yǔ)言,主要缺點(diǎn)是:涉及
太多機(jī)器資源的細(xì)節(jié)、依賴于機(jī)器硬件、移植性不好。
3.高級(jí)語(yǔ)言
由于匯編語(yǔ)言依賴于硬件體系,且助記符量大、難記,于是人們又發(fā)明了更加易用的高
級(jí)語(yǔ)言。這種語(yǔ)言接近于數(shù)學(xué)語(yǔ)言或人的自然語(yǔ)言,同時(shí)又不依賴于計(jì)算機(jī)硬件,編出的程
序能在所有機(jī)器上通用。經(jīng)過(guò)努力,1954年,第一個(gè)完全脫離機(jī)器硬件的高級(jí)語(yǔ)言
——FORTRAN問(wèn)世了,這是程序設(shè)計(jì)語(yǔ)言發(fā)展史上的一個(gè)分水嶺,人們把機(jī)器語(yǔ)言和匯編語(yǔ)
言稱為低級(jí)語(yǔ)言(它與計(jì)算機(jī)硬件的距離比較近,但不便于人理解、不便于編寫程序),把以
后發(fā)展起來(lái)的語(yǔ)言稱為高級(jí)語(yǔ)言。
高級(jí)語(yǔ)言的編寫方式更接近人們的思維習(xí)慣,例如,可以用“+”來(lái)表示加法,用“-”
表示減法,并且它編寫的程序具有一定的通用性。低級(jí)語(yǔ)言涉及計(jì)算機(jī)硬件細(xì)節(jié),所以不具
有通用性。高級(jí)語(yǔ)言遠(yuǎn)離機(jī)器語(yǔ)言,與具體的計(jì)算機(jī)硬件關(guān)系不大,因而寫出來(lái)的程序可移
3
C語(yǔ)言程序設(shè)計(jì)(第二版)
植性好、重用率高。要想在某一臺(tái)計(jì)算機(jī)上運(yùn)行用高級(jí)語(yǔ)言所編寫的程序,該計(jì)算機(jī)只需要
提供該語(yǔ)言的翻譯系統(tǒng)即可。
但是,一般的高級(jí)語(yǔ)言難以實(shí)現(xiàn)匯編語(yǔ)言的一些功能(匯編語(yǔ)言可以直接對(duì)硬件進(jìn)行操
作),人們需要有一種既有高級(jí)語(yǔ)言的易編寫、可移植性好等特性,又具有匯編語(yǔ)言精煉和接
近硬件的特性,在這種情況下C語(yǔ)言應(yīng)運(yùn)而生。
1.2C語(yǔ)言的發(fā)展簡(jiǎn)史
C語(yǔ)言,從誕生之初就在程序員中備受青睞。目前,C語(yǔ)言編譯器普遍存在于各種不同
的操作系統(tǒng)中,例如UNIX、MicrosoftWindows及Linux等。C語(yǔ)言的設(shè)計(jì)影響了許多后來(lái)的
編程語(yǔ)言,如C++、Java、C#等。
1.2.1C語(yǔ)言的起源
20世紀(jì),人們一直在為貝爾實(shí)驗(yàn)室的發(fā)明歡呼,那里是7項(xiàng)諾貝爾獎(jiǎng)的誕生地。Ken
Thompson和DennisM.Ritchie(見(jiàn)圖1-1)從大學(xué)畢業(yè)后就進(jìn)入到貝爾實(shí)驗(yàn)室工作直到退休,
傳奇的C語(yǔ)言和UNIX操作系統(tǒng)也由此誕生。
1964年,Thompson參與了貝爾實(shí)驗(yàn)室、麻省
理工學(xué)院以及通用電氣公司聯(lián)合開(kāi)發(fā)的一套多用戶
的分時(shí)操作系統(tǒng),名叫Multics。在開(kāi)發(fā)Multics期
間,Thompson創(chuàng)造了名為Bon的程序設(shè)計(jì)語(yǔ)言(簡(jiǎn)
稱B語(yǔ)言)。Thompson身為優(yōu)秀的設(shè)計(jì)師,同時(shí)又
是一名游戲愛(ài)好者,他設(shè)計(jì)了一款電子游戲
——SpaceTravel,該游戲可運(yùn)行于Multics操作系統(tǒng)
之上。1969年,貝爾實(shí)驗(yàn)室撤出了Multics計(jì)劃。
Thompson決定獨(dú)自在一臺(tái)被丟棄的PDP-7上寫一
個(gè)擠干了泡沫的Multics操作系統(tǒng),并在此操作系統(tǒng)
下重寫了他的SpaceTravel游戲。這一操作系統(tǒng)被
同事戲稱為UniplexedInformationandComputing圖1-1KenThompson和DennisM.Ritchie
System(UNICS),后來(lái)改稱為UNIX。
UNIX的出現(xiàn)開(kāi)始并不為大家所看好,但是卻引起了貝爾實(shí)驗(yàn)室另一位同事的注意,這就是
DennisM.Ritchie,Dennis主動(dòng)加入進(jìn)來(lái)共同完善這個(gè)系統(tǒng)。至此一場(chǎng)轟轟烈烈的UNIX的傳奇時(shí)
代才真正拉開(kāi)了序幕。1972年,他們聯(lián)手將UNIX移植到當(dāng)時(shí)最先進(jìn)的大型機(jī)PDP-2上,由于
UNIX非常簡(jiǎn)潔、穩(wěn)定與高效,以至于當(dāng)時(shí)大家都放棄了PDP-2上自帶的DEC操作系統(tǒng)而完全
改用UNIX,這時(shí)的UNIX已經(jīng)開(kāi)始走向成熟。隨著UNIX的需求量日益增加,Ken與Dennis決
定將UNIX進(jìn)一步改寫,以便可以移植到各種不同的硬件系統(tǒng)。由于UNIX的源代碼中不少是用
4
第1章引言
匯編語(yǔ)言完成的,不具備良好的移植性。1973年,Dennis在B語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)出了C語(yǔ)言,
并用C語(yǔ)言重寫了UNIX,C語(yǔ)言靈活、高效,與硬件無(wú)關(guān),并且不失其簡(jiǎn)潔性,正是UNIX移
植所需要的法寶,于是UNIX與C語(yǔ)言完美結(jié)合在一起,產(chǎn)生了新的可移植的UNIX操作系統(tǒng)。
隨著UNIX的廣泛使用,C語(yǔ)言也成為當(dāng)時(shí)最受歡迎的編程語(yǔ)言并延續(xù)至今。
說(shuō)到UNIX與C語(yǔ)言,還有一段小故事。當(dāng)時(shí)安裝了UNIX的PDP-11被放在貝爾實(shí)驗(yàn)室
供大家使用,有一天大家發(fā)現(xiàn)Ken總是可以得到最高的權(quán)限輕松進(jìn)入他們的賬戶,在貝爾實(shí)
驗(yàn)室這種高人云集的地方,這簡(jiǎn)直讓人太不能容忍了,于是有若干高手,仔細(xì)分析UNIX代
碼,找到后門,修改后再重新編譯整個(gè)UNIX。當(dāng)所有人都以為這個(gè)世界應(yīng)該從此清靜的時(shí)
候,卻發(fā)現(xiàn)Ken還是很容易就取得了他們的賬戶權(quán)限,為此大家郁悶不已。直到很多年后,
Ken才道出其中的原委,原來(lái)代碼里確實(shí)存在后門,不過(guò)并不在UNIX代碼中,而是藏在編
譯UNIX的C編譯器里,每次C編譯器編譯UNIX代碼時(shí)就會(huì)自動(dòng)加入后門代碼,而當(dāng)時(shí)整個(gè)
貝爾實(shí)驗(yàn)室用的都是Ken所寫的C編譯器。Ken和Dennis被尊稱為黑客的鼻祖,他們代表了真
正的黑客精神:做事情以興趣為出發(fā)點(diǎn);極富鉆研精神、喜歡迎接挑戰(zhàn);樂(lè)于分享、不計(jì)回報(bào)。
1983年,因?yàn)閁NIX和C語(yǔ)言的巨大成功,Ken和Dennis共同獲得當(dāng)年度計(jì)算機(jī)界最高
獎(jiǎng)——圖靈獎(jiǎng)。
1.2.2C語(yǔ)言的發(fā)展
1978年,BrianKernighan和Ritchie合著的TheCProgrammingLanguage出版,成為C程
序員必讀的“圣經(jīng)”,是各種C語(yǔ)言版本的基礎(chǔ)。
隨著C語(yǔ)言的不斷發(fā)展擴(kuò)充,1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)開(kāi)始制定新的C語(yǔ)言標(biāo)準(zhǔn),
1989年完成,稱為C89標(biāo)準(zhǔn);到了1995年,C語(yǔ)言又發(fā)生了一些變化,1999年推出新標(biāo)準(zhǔn),
稱為C99標(biāo)準(zhǔn)。2011年,ISO正式發(fā)布了C語(yǔ)言的新標(biāo)準(zhǔn)C11,新的標(biāo)準(zhǔn)提高了對(duì)C++的兼
容性,并增加了一些新的特性。
無(wú)從考證究竟有多少軟件是用C語(yǔ)言編寫的,但我們賴以生存的很多重量級(jí)軟件中確實(shí)
大多數(shù)都是用C語(yǔ)言編寫的??梢赃@么說(shuō),幾乎沒(méi)有不能用C語(yǔ)言實(shí)現(xiàn)的軟件,沒(méi)有不支持
C語(yǔ)言的系統(tǒng)。在世界編程語(yǔ)言排行榜中(),C語(yǔ)言總是排在數(shù)一數(shù)二的位置。
圖1-2(a)和圖1-2(b)分別是2014年3月和4月,TIOBE的編程語(yǔ)言排行情況。
(a)2014年3月,TIOBE的編程語(yǔ)言排行情況(b)2014年4月,TIOBE的編程語(yǔ)言排行情況
圖1-2TIOBE編程語(yǔ)言排行
5
C語(yǔ)言程序設(shè)計(jì)(第二版)
C語(yǔ)言對(duì)現(xiàn)代編程語(yǔ)言有著巨大的影響,許多現(xiàn)代編程語(yǔ)言都借鑒了大量C的特性。在
眾多基于C的語(yǔ)言中,以下幾種非常具有代表性。
C++:包括了所有C的特性,增加了類和其他特性以支持面向?qū)ο缶幊蹋?/p>
Java:基于C++,所以也繼承了C的許多特性;
C#:是綜合C++和Java而發(fā)展起來(lái)的一種較新的語(yǔ)言;
Perl:是一種強(qiáng)大的腳本語(yǔ)言,在發(fā)展過(guò)程中采用了C的許多特性;
PHP:是一種HTML內(nèi)嵌式腳本語(yǔ)言,其語(yǔ)法混合了C、Java和Perl。
1.2.3C語(yǔ)言的特點(diǎn)
C語(yǔ)言既有高級(jí)語(yǔ)言的特點(diǎn),又有匯編語(yǔ)言的特點(diǎn)。發(fā)明C語(yǔ)言是為了編寫以往由匯編
語(yǔ)言編寫的應(yīng)用程序,因此能夠在有限的內(nèi)存空間里快速運(yùn)行就顯得至關(guān)重要。
C語(yǔ)言擁有一個(gè)龐大的數(shù)據(jù)類型和運(yùn)算符集合,這個(gè)集合使得C語(yǔ)言具有強(qiáng)大的表達(dá)能
力,寥寥幾行代碼往往就可以實(shí)現(xiàn)許多功能。
C語(yǔ)言是一種包容性語(yǔ)言,不像其他語(yǔ)言那樣為減少程序員犯錯(cuò),提供太多范式來(lái)約束
程序員。C語(yǔ)言假設(shè)用戶知道自己在做什么,這種信任給程序員帶來(lái)了自由,他們擁有最大
的發(fā)揮空間,可以自由地編寫代碼。這些精心設(shè)計(jì)的代碼運(yùn)行效率高,可以極大地節(jié)約資源。
可是從另一方面講,這使得C程序更容易隱藏錯(cuò)誤,C的靈活性導(dǎo)致編程出錯(cuò)概率高,在用
其他語(yǔ)言編程時(shí)可以發(fā)現(xiàn)的錯(cuò)誤,C編譯器卻不加限制。
優(yōu)缺點(diǎn)經(jīng)常是同源的,C語(yǔ)言更是如此,其優(yōu)缺點(diǎn)主要來(lái)自于C語(yǔ)言與硬件的緊密結(jié)合
及其賦予程序員的自由空間。C語(yǔ)言中那些容易導(dǎo)致初學(xué)者出錯(cuò)的特性,往往也正是編程高
手為之吸引的特性。
C語(yǔ)言是編寫操作系統(tǒng)的最好選擇。因?yàn)樗苤苯优c計(jì)算機(jī)底層打交道,精巧、靈活、
高效。也正因?yàn)樗倪@種特性,在對(duì)運(yùn)行效率要求較高的系統(tǒng)中,如設(shè)備驅(qū)動(dòng)程序、高性能
實(shí)時(shí)中間件、嵌入式領(lǐng)域、并發(fā)程序設(shè)計(jì)等,C語(yǔ)言也是首選。在需要繼承和維護(hù)已有的C
代碼的地方,也需要C語(yǔ)言。在涉及編程能力的考試環(huán)節(jié),通常考的都是C語(yǔ)言。
1.3第一個(gè)C程序
首先從一個(gè)最簡(jiǎn)單的C語(yǔ)言程序開(kāi)始,建立C語(yǔ)言程序的基本概念。這個(gè)程序的任務(wù)是
編寫一個(gè)C語(yǔ)言程序能輸出如下一行文字:
hello,world
“hello,world”程序最早出現(xiàn)于Kernighan1972年編寫的內(nèi)部技術(shù)文檔Introductiontothe
LanguageB之中,后來(lái)該程序出現(xiàn)在Kernighan和Ritchie的經(jīng)典名著TheCProgramming
Language一書中。因C語(yǔ)言的廣泛使用而逐漸成為各種程序設(shè)計(jì)語(yǔ)言中最基本、最簡(jiǎn)單的程
6
第1章引言
序,通常是初學(xué)者所編寫的第一個(gè)程序。
試試看:輸出"hello,world"。
C程序從編寫到運(yùn)行要經(jīng)過(guò)四個(gè)基本過(guò)程:編輯、編譯、鏈接、運(yùn)行。下面就從如何實(shí)
現(xiàn)“hello,world”的輸出來(lái)分析這四個(gè)基本過(guò)程。
1.3.1編輯源程序
源程序是一系列的語(yǔ)句或指令,用于指示計(jì)算機(jī)執(zhí)行指定的任務(wù)。大多數(shù)編譯器都自帶
編輯器,可用來(lái)輸入源程序,并且提供很多便于編寫和組織程序的功能。通常會(huì)對(duì)程序文本
的格式進(jìn)行自動(dòng)排版,如高亮顯示特殊的語(yǔ)法及代碼自動(dòng)縮進(jìn)等功能,這樣不僅便于閱讀,
也幫助減少代碼的錯(cuò)誤率。
常用的C語(yǔ)言編譯器有VisualC++6.0集成開(kāi)發(fā)環(huán)境、Dev-C++集成開(kāi)發(fā)環(huán)境和Code::
Blocks,它們各有優(yōu)缺點(diǎn)。大多數(shù)C語(yǔ)言課程都采用VisualC++6.0編譯器,但VisualC++6.0
一直不支持C99標(biāo)準(zhǔn)。本書沒(méi)有把C99標(biāo)準(zhǔn)貫穿其中,而在附錄E中介紹了C99標(biāo)準(zhǔn)。
/*程序1-1:在屏幕上輸出"hello,world"*/
#include<stdio.h>
intmain(void)
{
printf("hello,world\n");
return0;
}
打開(kāi)編輯器,輸入以上程序,然后保存該文件。注意不要遺漏圓括號(hào)()、花括號(hào){}、雙引
號(hào)""、分號(hào)等。1.4節(jié)會(huì)對(duì)程序的要素進(jìn)行詳細(xì)的說(shuō)明,這里僅做簡(jiǎn)要介紹,程序第一行
#include<stdio.h>
是必不可少的,它包含了C語(yǔ)言標(biāo)準(zhǔn)輸入/輸出庫(kù)函數(shù)的相關(guān)信息。
每個(gè)C程序都由一個(gè)或多個(gè)函數(shù)構(gòu)成,其中必須有一個(gè)main()——因?yàn)槊總€(gè)程序總是從這個(gè)函
數(shù)開(kāi)始執(zhí)行。一對(duì)花括號(hào)內(nèi)的代碼塊,稱為函數(shù)體,它包含了定義函數(shù)功能的所有語(yǔ)句。這個(gè)例
子中的main()函數(shù)體非常簡(jiǎn)單:
printf("hello,world\n");
printf()函數(shù)用來(lái)顯示期望信息"hello,world",然而字符\n并沒(méi)有打印在屏幕上,\n表示顯
示信息后要進(jìn)行換行操作。
return0;
表明程序終止時(shí)會(huì)向操作系統(tǒng)返回0。
1.3.2編譯、鏈接和運(yùn)行
我們編寫了程序1-1,并生成了一個(gè)名為hello.c的文件(C程序的文件擴(kuò)展名為.c)。接
下來(lái),就需要把程序轉(zhuǎn)化為機(jī)器可以執(zhí)行的形式。通常情況下,系統(tǒng)需要做以下3項(xiàng)工作:
7
C語(yǔ)言程序設(shè)計(jì)(第二版)
1.預(yù)處理及編譯
C語(yǔ)言源代碼接近人類語(yǔ)言,便于人們理解和表達(dá),但計(jì)算機(jī)無(wú)法理解C語(yǔ)言源代碼,
計(jì)算機(jī)只能理解被翻譯成機(jī)器語(yǔ)言的二進(jìn)制指令,因此必須將源代碼轉(zhuǎn)換為機(jī)器語(yǔ)言,C程
序才能被計(jì)算機(jī)執(zhí)行。這個(gè)轉(zhuǎn)換工作是由名為編譯器的程序完成的。編譯器會(huì)把源代碼轉(zhuǎn)換
成機(jī)器語(yǔ)言指令(目標(biāo)代碼)。編譯器可以在轉(zhuǎn)換的過(guò)程中發(fā)現(xiàn)并報(bào)告錯(cuò)誤。編譯階段出現(xiàn)錯(cuò)
誤,意味著必須重新編輯源代碼。反之,如果編譯成功,就會(huì)產(chǎn)生一個(gè)目標(biāo)文件,該文件與
源文件同名,但擴(kuò)展名是.o或.obj。但是,這時(shí)的程序還不能運(yùn)行。
在任何一個(gè)C語(yǔ)言系統(tǒng)中,總有一個(gè)預(yù)處理程序,在編譯工作開(kāi)始之前自動(dòng)執(zhí)行,預(yù)處理
器處理以#開(kāi)頭的命令,如程序1-1中的#include<stdio.h>,將文件stdio.h包含進(jìn)來(lái)一起編譯。
2.鏈接
一個(gè)C語(yǔ)言源程序通常會(huì)調(diào)用在其他地方定義的函數(shù),如標(biāo)準(zhǔn)函數(shù)庫(kù)或同一個(gè)項(xiàng)目組的其
他成員編寫的函數(shù)庫(kù)中定義的函數(shù)。鏈接器把由編譯器產(chǎn)生的目標(biāo)文件和函數(shù)庫(kù)中已經(jīng)編譯過(guò)
的目標(biāo)代碼組合起來(lái),生成最終的可執(zhí)行文件,如圖1-3所示。鏈接器也可以檢查和報(bào)告錯(cuò)誤,
例如遺漏了程序的某個(gè)部分,或者引用了一個(gè)根本不存在的庫(kù)函數(shù)等。鏈接階段出現(xiàn)錯(cuò)誤,也
意味著必須重新編輯源代碼。如果鏈接成功,就會(huì)產(chǎn)生一個(gè)可執(zhí)行文件(擴(kuò)展名為.exe)。
圖1-3鏈接器的作用
3.加載和運(yùn)行
通過(guò)鏈接得到的可執(zhí)行文件在執(zhí)行之前,必須被加載到內(nèi)存中。最后,在CPU的控制下,
逐條執(zhí)行程序中的機(jī)器指令。在大多數(shù)IDE中,都有一個(gè)相應(yīng)的命令菜單,來(lái)運(yùn)行編譯、鏈
接得到的可執(zhí)行程序??梢圆捎迷诿畲翱谳斎胛募騑indows中雙擊文件名的方式來(lái)
運(yùn)行可執(zhí)行程序。這一階段,計(jì)算機(jī)會(huì)精準(zhǔn)地執(zhí)行指令,運(yùn)行結(jié)果可能是正確的,也可能是
錯(cuò)誤的,甚至可能造成計(jì)算機(jī)系統(tǒng)的崩潰。
1.3.3程序開(kāi)發(fā)周期
編譯、鏈接和運(yùn)行過(guò)程中都可能發(fā)現(xiàn)錯(cuò)誤,這意味著要返回編輯階段,檢查并修改源代
碼。編寫程序是一件復(fù)雜的工作,難免出現(xiàn)錯(cuò)誤,所以需要逐步處理錯(cuò)誤,直到獲得期望的
8
第1章引言
結(jié)果為止。圖1-4總結(jié)了創(chuàng)建執(zhí)行C程序的各個(gè)過(guò)程。
圖1-4創(chuàng)建和執(zhí)行程序的過(guò)程
1.4剖析一個(gè)簡(jiǎn)單的程序
下面是另一個(gè)簡(jiǎn)單程序的例子,從中可以了解各行代碼的作用,并由此了解一些通用的
程序格式。
/*程序1-2:計(jì)算兩個(gè)整數(shù)的和*/
/*此程序輸出兩個(gè)整數(shù)的和*/
#include<stdio.h>/*預(yù)處理指令*/
intmain(void)
{
inta,b,sum;/*定義整型變量a、b、sum*/
a=3;/*為a、b賦值*/
b=5;
sum=a+b;/*計(jì)算a與b的和并賦給sum*/
printf("%d\n",sum);/*輸出sum的值*/
return0;
}
9
C語(yǔ)言程序設(shè)計(jì)(第二版)
1.注釋
程序1-2中的第一行
/*此程序輸出兩個(gè)整數(shù)的和*/
以“/*”開(kāi)始,以“*/”結(jié)束,這部分內(nèi)容是注釋。在程序中添加注釋是一個(gè)非常好的編程
習(xí)慣,注釋可以放在程序的任意位置,用來(lái)說(shuō)明代碼的作用、解釋代碼的工作原理。編譯器
在編譯程序時(shí)會(huì)忽略所有的注釋,不會(huì)為注釋生成任何可執(zhí)行代碼。增加注釋是為了增強(qiáng)程
序的可讀性以及更好地進(jìn)行團(tuán)隊(duì)合作。
注釋可以單獨(dú)占一行,例如:
/*此程序輸出兩個(gè)整數(shù)的和*/
#include<stdio.h>/*預(yù)處理指令*/
intmain(void)
{
inta,b,sum;/*定義整型變量a、b、sum*/
…
}
一個(gè)注釋可以分散在多行上,無(wú)論“/*”和“*/”出現(xiàn)在程序的什么地方,/*和*/之間的
所有內(nèi)容都是注釋。下面這個(gè)注釋是用來(lái)說(shuō)明代碼的作者及創(chuàng)建日期等信息。
/**************************
作者:
創(chuàng)建日期:
描述:
…
***************************/
C99標(biāo)準(zhǔn)中支持C++語(yǔ)言中的單行注釋“//”,從“//”到行尾的任何字符都是注釋。這種
注釋方法既可以用于整行注釋,也可以用于在一行代碼的右側(cè)加注釋。
inta,b,sum;//定義整型變量a、b、sum
VisualC++支持單行注釋“//”。因?yàn)閂isualC++雖不支持C99,但它支持C++。而C99標(biāo)
準(zhǔn)中的注釋//,就是借鑒了C++的注釋風(fēng)格。
2.預(yù)處理
程序1-2由下列代碼行開(kāi)始:
#include<stdio.h>
在編譯C程序之前,預(yù)處理器會(huì)首先對(duì)其進(jìn)行處理。本書將在第11章詳細(xì)討論預(yù)處理器
指令,在這里只關(guān)注#include指令。這條指令說(shuō)明,在編譯前將<stdio.h>中的信息“包含”到
程序中。<stdio.h>是標(biāo)準(zhǔn)輸入/輸出頭文件,包含了編譯器理解printf()以及其他輸入輸出函數(shù)
所需要的信息。
以.h為擴(kuò)展名的文件稱為頭文件,頭文件可以是編譯器自帶的頭文件,主要包含與C標(biāo)
準(zhǔn)庫(kù)函數(shù)相關(guān)的聲明,也可以是自己創(chuàng)建的頭文件。C語(yǔ)言的一個(gè)突出優(yōu)點(diǎn)就是它具有標(biāo)準(zhǔn)
庫(kù),包含了數(shù)百個(gè)用于輸入/輸出、字符串處理等實(shí)用操作的函數(shù),參見(jiàn)附錄D。
10
第1章引言
3.main()函數(shù)
一個(gè)C程序可以包含一個(gè)或多個(gè)函數(shù),幾乎所有的功能都由函數(shù)實(shí)現(xiàn),除了直接調(diào)用標(biāo)
準(zhǔn)庫(kù)函數(shù),還可以為實(shí)現(xiàn)某個(gè)功能編寫自定義函數(shù),C語(yǔ)言可以稱作函數(shù)語(yǔ)言。每個(gè)程序都
必須有一個(gè)main()函數(shù),因?yàn)樵趫?zhí)行程序時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用main()函數(shù),從main()函數(shù)開(kāi)始
執(zhí)行。在第5章,將學(xué)習(xí)如何編寫自定義函數(shù),在此之前我們涉及的所有程序都只包含一個(gè)
main()函數(shù)。
在程序1-2中看到函數(shù)的定義intmain(void),表示程序結(jié)束時(shí)會(huì)返回一個(gè)整數(shù)值。return
0表示main()函數(shù)的返回值為0,這個(gè)值表示程序正常結(jié)束。
(1)main()函數(shù)的名字絕對(duì)不能修改,也不能寫成MAIN;
(2)每一個(gè)函數(shù)的函數(shù)體定義在一對(duì)花括號(hào)內(nèi),并且內(nèi)容要有統(tǒng)一的縮進(jìn)量,
這個(gè)縮進(jìn)能更加突出程序中函數(shù)的結(jié)構(gòu),增加程序的可讀性。
4.語(yǔ)句
C程序的執(zhí)行部分是由語(yǔ)句組成的。程序的功能也是由執(zhí)行語(yǔ)句實(shí)現(xiàn)的。程序1-2中用
到了三種語(yǔ)句,一種是賦值語(yǔ)句,如“sum=a+b;”;一種是返回語(yǔ)句,如“return0;”;還有
一種是函數(shù)調(diào)用語(yǔ)句,如printf("%d\n",sum)。要求某個(gè)函數(shù)執(zhí)行分派給它的任務(wù)稱為調(diào)用這
個(gè)函數(shù)。
C語(yǔ)言規(guī)定函數(shù)主體中的每個(gè)語(yǔ)句都以分號(hào)結(jié)束(這條規(guī)則也有例外:從第3章開(kāi)始會(huì)
遇到復(fù)合語(yǔ)句,復(fù)合語(yǔ)句就不以分號(hào)結(jié)尾)。C程序中的一個(gè)語(yǔ)句可以跨越多行,用分號(hào)通知
編譯器該語(yǔ)句已結(jié)束。另外,預(yù)處理指令通常只占一行,不需要用分號(hào)結(jié)束。
(1)在每個(gè)逗號(hào)后面加一個(gè)空格,可以增加程序的可讀性;
(2)在二元運(yùn)算符(如“+”)的前后各加一個(gè)空格,能突出二元運(yùn)算符,
并增加程序的可讀性。
5.輸入/輸出
為了從鍵盤獲取輸入的數(shù)值,要用到scanf()函數(shù);為了把計(jì)算結(jié)果輸出到顯示器中,要
用到printf()函數(shù)。這兩個(gè)函數(shù)都是標(biāo)準(zhǔn)庫(kù)函數(shù),都需要使用格式串來(lái)指定輸入或輸出數(shù)據(jù)的
形式。第2章中將詳細(xì)介紹這兩個(gè)函數(shù)。
在程序1-2中,對(duì)于變量a和b,用賦值語(yǔ)句來(lái)賦值a=3和b=5,若要計(jì)算任意兩個(gè)整數(shù)
的和該如何處理?可以通過(guò)調(diào)用scanf()函數(shù)來(lái)實(shí)現(xiàn):
scanf("%d",&a);
scanf("%d",&b);
也可以寫成一條語(yǔ)句:
scanf("%d%d",&a,&b);
若要將程序的處理結(jié)果在屏幕上輸出,可以調(diào)用printf()函數(shù)來(lái)實(shí)現(xiàn):
printf("%d\n",sum);
6.標(biāo)識(shí)符
標(biāo)識(shí)符是由字母、數(shù)字和下劃線組成的字符序列,其中第一個(gè)字符必須是字母或下劃線。
11
C語(yǔ)言程序設(shè)計(jì)(第二版)
例如,sum是一個(gè)合法的標(biāo)識(shí)符,而sum&number是非法的。在C語(yǔ)言中,標(biāo)識(shí)符中的英文
字母是區(qū)分大小寫的,例如,sum和SUM是兩個(gè)不同的標(biāo)識(shí)符。標(biāo)識(shí)符分為三類:
(1)關(guān)鍵字:C語(yǔ)言有32個(gè)關(guān)鍵字。關(guān)鍵字具有特殊意義,它們主要與數(shù)據(jù)類型和語(yǔ)句
有關(guān),如int用于定義整數(shù)類型,return用于函數(shù)的返回。程序中不能將關(guān)鍵字用于其他目的,
具體的關(guān)鍵字信息請(qǐng)看附錄B。
(2)預(yù)定義標(biāo)識(shí)符:預(yù)定義標(biāo)識(shí)符包括編譯預(yù)處理命令,如include、define等;系統(tǒng)標(biāo)
準(zhǔn)庫(kù)函數(shù)名,如scanf()、printf()、strcpy()、strcmp()、sqrt()等。
(3)用戶自定義標(biāo)識(shí)符:用于對(duì)用戶使用的變量、數(shù)組、函數(shù)等操作對(duì)象進(jìn)行命名。
用戶自定義標(biāo)識(shí)符不能與C編譯系統(tǒng)已經(jīng)預(yù)定義的、具有特殊用途的關(guān)鍵字同名,如不能
將自定義標(biāo)識(shí)符命名為int,也盡量不要與預(yù)定義標(biāo)識(shí)符重名,否則會(huì)改變其原有含義。
1.5簡(jiǎn)單程序舉例
閱讀以下三個(gè)程序,進(jìn)一步理解上節(jié)所介紹的C語(yǔ)言語(yǔ)法要素。
/*程序1-3:計(jì)算并輸出一個(gè)整數(shù)的平方*/
#include<stdio.h>
intmain(void)/*main為函數(shù)名,程序從這里開(kāi)始運(yùn)行*/
{/*函數(shù)體開(kāi)始*/
inta,b;
a=5;
b=a*a;
printf("b=%d\n",b);/*執(zhí)行程序的輸出結(jié)果為:b=25*/
return0;
}/*函數(shù)體結(jié)束*/
/*程序1-4:輸入兩個(gè)整數(shù),輸出其中較大的整數(shù)*/
#include<stdio.h>
intmain(void)
{
inta,b,max;
scanf("%d%d",&a,&b);
if(a>b)/*如果a>b,則把a(bǔ)賦給max;否則把b賦給max*/
max=a;
else
max=b;
printf("最大值為%d\n",max);
return0;
12
第1章引言
}
/*程序1-5:輸入一個(gè)負(fù)實(shí)數(shù),輸出其絕對(duì)值*/
#include<stdio.h>
#include<math.h>/*在使用數(shù)學(xué)函數(shù)前的預(yù)包含命令*/
intmain(void)
{
doublea,b;
scanf("%lf",&a);
b=fabs(a);/*使用數(shù)學(xué)函數(shù)fabs()求絕對(duì)值*/
printf("%f的絕對(duì)值是:%f\n",a,b);
return0;
}
請(qǐng)編輯、編譯、鏈接、運(yùn)行以上3個(gè)程序,看看會(huì)遇到什么問(wèn)題。
初學(xué)者常見(jiàn)的編譯錯(cuò)誤如下:
(1)遺漏分號(hào);
(2)遺漏scanf()或printf()中的雙引號(hào);
(3)遺漏逗號(hào);
(4)缺少必需的空格,如把“return0;”寫成“return0;”;
(5)缺少花括號(hào)。
在編譯階段,當(dāng)編譯器發(fā)現(xiàn)某些內(nèi)容無(wú)法編譯時(shí),會(huì)停止工作,并給出錯(cuò)誤提示,指出
問(wèn)題出在哪里。例如,將語(yǔ)句
inta,b,max;
誤寫成了
inta,b,max
VC6.0編譯器會(huì)給出以下錯(cuò)誤提示,如圖1-5所示。
圖1-5編譯錯(cuò)誤提示
13
C語(yǔ)言程序設(shè)計(jì)(第二版)
編譯器指出第7行scanf前缺少分號(hào),而實(shí)際上是第5行的聲明語(yǔ)句遺漏了一個(gè)分號(hào)。
編譯器所給錯(cuò)誤消息為何與實(shí)際不符?原因在于,編譯器并不關(guān)心換行符,上一行末尾的分
號(hào)也可以放在下一行的開(kāi)頭,編譯器讀了第5行之后,它在期待一個(gè)分號(hào),它跳過(guò)第6行的
空行,在遇到第7行的下一個(gè)命令時(shí),才能確定遺漏了一個(gè)分號(hào),因此指出第7行有錯(cuò)。多
數(shù)情況下,編譯器能準(zhǔn)確指出出錯(cuò)的位置,但如果在編譯器所指示的行中找不到錯(cuò)誤,通常
錯(cuò)誤是在前一行。
若在printf()函數(shù)中遺漏了雙引號(hào),VC6.0編譯器給出的錯(cuò)誤信息如圖1-6所示。
圖1-6編譯錯(cuò)誤提示
編譯器給出15條錯(cuò)誤提示,第一條錯(cuò)誤提示正確指出了錯(cuò)誤,unknowncharacter意味著
編譯器無(wú)法識(shí)別一些符號(hào),因?yàn)樗鼈儧](méi)有被雙引號(hào)括起來(lái)。只要修改了該錯(cuò)誤,程序就能順
利通過(guò)編譯。我們得到的經(jīng)驗(yàn)是,如果編譯器報(bào)告了多個(gè)錯(cuò)誤,首先要找到第一個(gè)錯(cuò)誤,修
改并重新編譯,這個(gè)過(guò)程可能要重復(fù)多次,直到將編譯器指出的所有錯(cuò)誤修改完。
鏈接階段的錯(cuò)誤較少,通常是由于拼錯(cuò)函數(shù)名引起的。例如,把main寫成mian,把printf
寫成print。
習(xí)題
1.結(jié)合匯編語(yǔ)言、高級(jí)語(yǔ)言的特性來(lái)了解C語(yǔ)言的特點(diǎn)。
2.模仿例題編寫程序在屏幕上顯示:
ThisismyfirstCprogram!
14
第1章引言
3.模仿例題編寫程序在屏幕上顯示:
****
****
****
****
4.在屏幕上顯示:
*****
***
*
5.正確區(qū)分哪些是合法標(biāo)識(shí)符,哪些是不合法標(biāo)識(shí)符。
Abcdefine2xdoublestudent
m+ya#b-4_1While
intletx%ynamedo
πwtmCtrlswicthinclude
6.編寫程序,輸入兩個(gè)整數(shù)a、b,輸出a+b的和。(保證a+b的和在int
范圍內(nèi))
7.編寫程序,從鍵盤輸入兩個(gè)整數(shù),輸出其中較大值。
15
第2章簡(jiǎn)單C程序設(shè)計(jì)
●變量與常量的概念
●整數(shù)及浮點(diǎn)數(shù)據(jù)類型
●數(shù)據(jù)的輸入和輸出
●基本運(yùn)算符及表達(dá)式
●常用的數(shù)學(xué)函數(shù)
●編程解決簡(jiǎn)單問(wèn)題
無(wú)論學(xué)習(xí)哪種編程語(yǔ)言,都要掌握其基本語(yǔ)法。本章是我們學(xué)習(xí)C語(yǔ)言的第一步:通過(guò)
簡(jiǎn)單的C語(yǔ)言程序,引導(dǎo)大家了解它的基本要素組成。因?yàn)槌绦蛱幚淼闹饕獙?duì)象是數(shù)據(jù),數(shù)
據(jù)以哪種形式存在,又有哪些不同的存儲(chǔ)形式,都用在哪些方面,這是我們要深入了解的。
語(yǔ)法是枯燥的,實(shí)例是生動(dòng)的,認(rèn)識(shí)是漸進(jìn)的,讓我們一步一步進(jìn)入C語(yǔ)言的世界。
C語(yǔ)言程序設(shè)計(jì)(第二版)
2.1內(nèi)存與變量
本節(jié)將介紹內(nèi)存、變量和數(shù)據(jù)類型等基本概念,并通過(guò)一個(gè)實(shí)現(xiàn)溫度轉(zhuǎn)換的程序?qū)嵗齺?lái)
介紹如何把數(shù)據(jù)存入內(nèi)存、程序如何訪問(wèn)并處理這些數(shù)據(jù)。
2.1.1內(nèi)存
計(jì)算機(jī)執(zhí)行程序時(shí),組成程序的指令和程序所操作的數(shù)據(jù)都必須存儲(chǔ)在某個(gè)地方,這個(gè)
地方就是機(jī)器的內(nèi)存。
內(nèi)存可以理解為一排井然有序的小開(kāi)關(guān),每個(gè)開(kāi)關(guān)有兩個(gè)狀態(tài):開(kāi)表示為1,關(guān)表示為0。
將每個(gè)開(kāi)關(guān)表示為一個(gè)二進(jìn)制數(shù):0或1,稱為一位(bit)。為管理方便,通常以8位為一組,
稱為一個(gè)字節(jié)(byte),是計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)空間的基本單位。而210(1024)個(gè)字節(jié)稱為1KB,
210KB稱為1MB,210MB稱為1GB。
每臺(tái)計(jì)算機(jī)都安裝了一定數(shù)量的內(nèi)存。計(jì)算機(jī)中的內(nèi)存是逐字節(jié)排列的,每個(gè)字節(jié)的內(nèi)
存都對(duì)應(yīng)唯一的地址,用于標(biāo)識(shí)該字節(jié),字節(jié)的地址最小值為0,最大值取決于系統(tǒng)的內(nèi)存
容量。一般使用者不必關(guān)心地址,地址是由C編譯器自動(dòng)處理的。程序2-1展示了一個(gè)通過(guò)
變量來(lái)訪問(wèn)內(nèi)存數(shù)據(jù)的例子。
/*程序2-1:實(shí)現(xiàn)將華氏溫度轉(zhuǎn)換為攝氏溫度輸出*/
#include<stdio.h>
intmain(void)
{
intcelsius,fahr;
scanf("%d",&fahr);
celsius=5*(fahr-32)/9;
printf("fahr=%d,celsius=%d\n",fahr,celsius);
return0;
}
程序運(yùn)行時(shí)若輸入:100
則輸出如下:
fahr=100,celsius=37
celsius和fahr是變量名,各自對(duì)應(yīng)著計(jì)算機(jī)內(nèi)存中的一個(gè)存儲(chǔ)單元(一個(gè)或多個(gè)字節(jié))。
程序通過(guò)變量名來(lái)讀取某個(gè)內(nèi)存單元中的數(shù)據(jù)或在其中存儲(chǔ)一個(gè)新數(shù)據(jù)。
2.1.2變量
高級(jí)語(yǔ)言都能通過(guò)變量名來(lái)訪問(wèn)內(nèi)存中的數(shù)據(jù)。用變量名來(lái)標(biāo)識(shí)內(nèi)存中的某個(gè)存儲(chǔ)位置
18
第2章簡(jiǎn)單C程序設(shè)計(jì)
——由一個(gè)或多個(gè)連續(xù)的字節(jié)組成,在程序中使用變量名,實(shí)際上引用的是內(nèi)存中對(duì)應(yīng)的某
個(gè)存儲(chǔ)位置。
下面詳細(xì)介紹程序2-1中每行代碼的意義。
intcelsius,fahr;
這條代碼的作用是分配2個(gè)存儲(chǔ)單元,名字分別為celsius和fahr。
scanf("%d",&fahr);
這條代碼的作用是,讀入一個(gè)十進(jìn)制整數(shù),存入名字為fahr的存儲(chǔ)單元中;注意將一個(gè)值存
入變量中是具有破壞性的,它將替換掉該內(nèi)存位置中原來(lái)的數(shù)值。
celsius=5*(fahr-32)/9;
讀取fahr的值,進(jìn)行算術(shù)運(yùn)算,并將結(jié)果存入名字為celsius的內(nèi)存單元中。
printf("fahr=%d,celsius=%d\n",fahr,celsius);
這條代碼的作用是,用printf()函數(shù)輸出內(nèi)存變量fahr和celsius的值。
在C語(yǔ)言中,變量命名必須遵守以下規(guī)則:
變量名可以由字母、數(shù)字和_(下劃線)組合而成;
變量名不能包含除_(下劃線)以外的任何特殊字符,如:%、#、逗號(hào)、空格等;
變量名必須以字母或_(下劃線)開(kāi)頭;
變量名不能包含空白字符(換行符、空格和制表符稱為空白字符);
C語(yǔ)言中的某些詞(例如int和float等)稱為保留字,具有特殊意義,不能用作變
量名;
C語(yǔ)言區(qū)分大小寫,因此變量a與變量A是兩個(gè)不同的變量。
C89標(biāo)準(zhǔn)中規(guī)定變量名最多可以包含31個(gè)字符,給變量取名最好能做到“見(jiàn)名識(shí)義”。
對(duì)于由多個(gè)單詞組合而成的變量名,有多種風(fēng)格,其中采用較多的一種是用下劃線將單詞連
接,例如:student_name、student_score,如果不用下劃線,那么應(yīng)該將第一個(gè)單詞后面的每
個(gè)單詞都用大寫字母開(kāi)頭,如studentName、studentScore。編程者可以根據(jù)個(gè)人的喜好來(lái)選
取命名風(fēng)格,本書采用第二種方法。
(1)給變量起一個(gè)有含義的名字,可以使程序具有自文檔性,增加程序的
可讀性;
(2)由多個(gè)單詞組成的變量名能增加程序的可讀性;
(3)給簡(jiǎn)單變量命名時(shí),第一個(gè)字母一定要小寫。
2.1.3整數(shù)類型
在C語(yǔ)言中引入不同數(shù)據(jù)類型的目的是便于在程序中按不同方式和要求處理數(shù)據(jù)。由于
不同類型的數(shù)據(jù)在內(nèi)存中占用不同大小的存儲(chǔ)單元,可以參與不同的運(yùn)算,即使同樣是加法
運(yùn)算“+”,整數(shù)加法和浮點(diǎn)數(shù)加法在實(shí)現(xiàn)上也是完全不同的。
編寫程序時(shí),通常使用變量來(lái)存儲(chǔ)數(shù)據(jù),每個(gè)變量都具有三個(gè)屬性,即變量名、數(shù)據(jù)類
型和值。用變量來(lái)存儲(chǔ)數(shù)據(jù),系統(tǒng)就需要知道每個(gè)變量要存儲(chǔ)什么類型的數(shù)據(jù),然后為每個(gè)
19
C語(yǔ)言程序設(shè)計(jì)(第二版)
變量分配一塊對(duì)應(yīng)大小的內(nèi)存空間,用來(lái)存儲(chǔ)該類型的數(shù)據(jù)。
C語(yǔ)言的數(shù)據(jù)類型分為兩個(gè)大類:第一類是基本數(shù)據(jù)類型,包括整型、浮點(diǎn)型和字符型。
第二類是構(gòu)造數(shù)據(jù)類型,包括數(shù)組、結(jié)構(gòu)、聯(lián)合和枚舉。本節(jié)僅討論整數(shù)及浮點(diǎn)型數(shù)據(jù)類型,
其他數(shù)據(jù)類型將在后續(xù)章節(jié)陸續(xù)介紹。
C語(yǔ)言的整數(shù)類型有不同的取值范圍,為了處理不同范圍的整數(shù),除了基本整型int以外,
C語(yǔ)言提供了擴(kuò)展的整數(shù)類型,它們的表示方法是在int之前加上限定詞short、long或
unsigned。
有符號(hào)整數(shù)如果是正數(shù)或零,那么最高位(符號(hào)位)為0;如果是負(fù)數(shù),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 角膜板層術(shù)后的護(hù)理
- 脫硫技術(shù)培訓(xùn)
- 2025年射頻同軸電纜組件項(xiàng)目發(fā)展計(jì)劃
- 規(guī)范漢字書寫傳承中華文化之美國(guó)旗下演講稿
- 防恐反恐培訓(xùn)
- 2025年工藝氣體壓縮機(jī)合作協(xié)議書
- 預(yù)防腸道蠕動(dòng)減慢與便秘
- 門窗接單員培訓(xùn)
- 2025年平板顯示檢測(cè)系統(tǒng)項(xiàng)目發(fā)展計(jì)劃
- 銀行新聞協(xié)作培訓(xùn)
- 上海市建設(shè)工程施工圖設(shè)計(jì)文件勘察設(shè)計(jì)質(zhì)量疑難問(wèn)題匯編(2024 版)
- 2024年3、6、9月青少年軟件編程Python等級(jí)考試一級(jí)真題(全3套 含答案)
- 部編版小學(xué)語(yǔ)文三年級(jí)語(yǔ)文下冊(cè)第三單元集體備課教材分析解讀
- 2023年河北省安全生產(chǎn)舉報(bào)和獎(jiǎng)勵(lì)答試題及答案
- 《帶狀皰疹治療學(xué)》牛德興教授專業(yè)研究治療病毒性皰疹50年心血
- 20以內(nèi)進(jìn)位加法口算練習(xí)打印版
- 戴氏無(wú)線電遙控飛機(jī)教程
- 巴黎盧浮宮介紹PPT模板課件
- 蒂森克虜伯電梯曳引輪鋼絲繩安裝布置
- 小學(xué)食堂滿意度問(wèn)卷調(diào)查表
- 玻尿酸注射術(shù)前同意書
評(píng)論
0/150
提交評(píng)論