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