C語(yǔ)言程序設(shè)計(jì)(第二版)97871132070760000_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第二版)97871132070760000_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第二版)97871132070760000_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第二版)97871132070760000_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第二版)97871132070760000_第5頁(yè)
已閱讀5頁(yè),還剩361頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)閱讀全文

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論