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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

(第3版)林雄主講

2007.9C語(yǔ)言程序設(shè)計(jì)教程第1章C語(yǔ)言程序設(shè)計(jì)的概念第2章基本數(shù)據(jù)類型第3章C語(yǔ)言的流程控制第4章模塊化程序設(shè)計(jì)第5章數(shù)組第6章指針第7章用戶定制數(shù)據(jù)類型第8章文件第9章面向?qū)ο蟮某绦蛟O(shè)計(jì)介紹第1章C語(yǔ)言程序設(shè)計(jì)的概念1.1程序與程序設(shè)計(jì)語(yǔ)言1.2

C語(yǔ)言及其標(biāo)準(zhǔn)1.3

C語(yǔ)言程序概要1.1程序與程序設(shè)計(jì)語(yǔ)言

1.1.1常量一提起計(jì)算機(jī),人們就會(huì)聯(lián)想到鍵盤、顯示器和主機(jī)。其實(shí),應(yīng)用要早得多、并一直流傳至今的計(jì)算機(jī)工具是算盤(見圖1.1)。那么,現(xiàn)代電子計(jì)算機(jī)與算盤的最大區(qū)別在哪里呢?關(guān)鍵在于現(xiàn)代計(jì)算機(jī)可以自動(dòng)完成計(jì)算過(guò)程,而算盤進(jìn)行的計(jì)算過(guò)程是在人的撥動(dòng)下才能進(jìn)行。圖1.1算盤那么,為什么現(xiàn)代計(jì)算機(jī)可以自動(dòng)完成計(jì)算過(guò)程呢?這首先要從程序說(shuō)起。程序?qū)嶋H上是一個(gè)非常普通的概念:按照一定的順序安排的工作步驟。可以說(shuō),做任何事情都有相應(yīng)的程序。做的事情不同,要求的效果不同,程序就不同。例如,用同樣的原料,采用不同的程序,會(huì)做出不同的菜肴來(lái)。一種工具能夠自動(dòng)工作,一是要有記憶功能,能夠記住程序;二是具有按照程序控制相關(guān)部件操作的能力。如果能讓算盤記住做某種計(jì)算的口訣和計(jì)算的數(shù)據(jù),并且有能按照口訣控制算珠自動(dòng)運(yùn)動(dòng)的機(jī)制,則只要發(fā)出開始執(zhí)行的命令,算盤就會(huì)自動(dòng)完成計(jì)算。可惜這樣的機(jī)制并沒有在算盤中實(shí)現(xiàn)。但是,卻有另外一種機(jī)器卻在這方面向前推進(jìn)了一步。這就是明朝末年宋應(yīng)星在其《天工開物》中記載的中國(guó)古代提花機(jī)(見圖1.2)圖1.2中國(guó)古代的提花機(jī)中國(guó)提花機(jī)大約出現(xiàn)于西漢末年(公元前)。它采用用絲線結(jié)成的“花本”(花版)控制經(jīng)線起落,以織成要求的圖樣。這是最早的程序控制思想。后來(lái),提花機(jī)沿著絲綢之路傳到歐洲,歷經(jīng)改進(jìn),1805年法國(guó)人JosephJacquard制造成功用穿孔卡片(見圖1.3)控制連桿(橫針),用有孔和無(wú)孔進(jìn)一步控制經(jīng)線起落的提花機(jī)。圖1.3穿孔卡片

穿孔卡片把程序控制技術(shù)向前推進(jìn)了一步。這一技術(shù)被一位英國(guó)數(shù)學(xué)家CharlesBabbage(見圖1.4)引入到了計(jì)算機(jī)中機(jī),用有孔和無(wú)孔的組合來(lái)表示數(shù)據(jù)和程序。圖1.4英國(guó)數(shù)學(xué)家CharlesBabbage

18世紀(jì)末,法國(guó)數(shù)學(xué)界調(diào)集大批數(shù)學(xué)家,組成了人工手算的流水線,經(jīng)過(guò)長(zhǎng)期艱苦奮斗,終于完成了17卷《數(shù)學(xué)用表》的編制,但是,手工計(jì)算出的數(shù)據(jù)出現(xiàn)了大量錯(cuò)誤。這件事情強(qiáng)烈刺激了Babbage。1812年20歲的Babbage開始計(jì)算機(jī)的研制工作,他要把函數(shù)表的復(fù)雜算式轉(zhuǎn)化為差分運(yùn)算,用簡(jiǎn)單的加法代替平方運(yùn)算,快速編制不同函數(shù)的數(shù)學(xué)用表,并將這種機(jī)器稱為“差分機(jī)”。經(jīng)過(guò)十年的努力,終于于1822年完成了第一臺(tái)差分機(jī),可以處理3個(gè)不同的5位數(shù),計(jì)算精度達(dá)到6位小數(shù)。1833年他又開始投身于一種“會(huì)分析的機(jī)器”——分析機(jī)的研制中。他把機(jī)器設(shè)計(jì)成三個(gè)部分,一是用來(lái)儲(chǔ)存數(shù)據(jù)信息的“倉(cāng)庫(kù)(TheStore)”,二是進(jìn)行數(shù)據(jù)運(yùn)算處理的“工場(chǎng)(Themill)”,三是使用穿孔卡片來(lái)輸入程序并用穿孔卡片輸出數(shù)據(jù)。這臺(tái)機(jī)器雖然沒有制造成功,但它的工作原理—程序存儲(chǔ)控制為今天的計(jì)算機(jī)奠定了基礎(chǔ):(1)任何工具的工作,都是由程序控制的;(2)只有工具具有了記憶程序的功能,并具有了按照程序進(jìn)行自我控制的功能,該工具才能自動(dòng)工作。

1.1.2計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言程序要需要用某種形式(語(yǔ)言)來(lái)描述。例如,用算盤進(jìn)行計(jì)算,程序是用口訣描述的,珠算的語(yǔ)言是口訣?,F(xiàn)代計(jì)算機(jī)的程序則是用計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言來(lái)描述的。從計(jì)算機(jī)誕生到今天,程序設(shè)計(jì)語(yǔ)言也在伴著計(jì)算機(jī)技術(shù)的進(jìn)步不斷升級(jí)換代。1.1.2計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言

程序要需要用某種形式(語(yǔ)言)來(lái)描述。例如,用算盤進(jìn)行計(jì)算,程序是用口訣描述的,珠算的語(yǔ)言是口訣?,F(xiàn)代計(jì)算機(jī)的程序則是用計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言來(lái)描述的。從計(jì)算機(jī)誕生到今天,程序設(shè)計(jì)語(yǔ)言也在伴著計(jì)算機(jī)技術(shù)的進(jìn)步不斷升級(jí)換代。1.機(jī)器語(yǔ)言一種CPU的指令系統(tǒng),也稱該CPU的機(jī)器語(yǔ)言,它是該CPU可以識(shí)別的一組由0和1序列構(gòu)成的指令碼。下面是某CPU指令系統(tǒng)中的兩條指令:

10000000(進(jìn)行一次加法運(yùn)算)

10010000(進(jìn)行一次減法運(yùn)算)用機(jī)器語(yǔ)言編程序,就是從所使用的CPU的指令系統(tǒng)中挑選合適的指令,組成一個(gè)指令系列。這種程序雖然可以被機(jī)器直接理解和執(zhí)行,卻由于它們不直觀,難記、難認(rèn)、難理解、不易查錯(cuò),只能被少數(shù)專業(yè)人員掌握,同時(shí)編寫程序的效率很低,質(zhì)量難以保證。這種繁重的手工方式與高速、自動(dòng)工作的計(jì)算機(jī)極不相稱。這種方式僅使用于計(jì)算機(jī)出現(xiàn)的初期(使用穿孔紙帶的時(shí)期)的編程(用有孔、無(wú)孔,分別代表1、0),現(xiàn)在已經(jīng)不再使用。

2.匯編語(yǔ)言為減輕人們?cè)诰幊讨械膭趧?dòng)強(qiáng)度,20世紀(jì)50年代中期人們開始用一些“助記符號(hào)”來(lái)代替0,1碼編程。如前面的兩條機(jī)器指令可以寫為

A+B=>A或ADDA,B

A-B=>個(gè)樣A或SUBA,B這種用助記符號(hào)描述的指令系統(tǒng),稱為符號(hào)語(yǔ)言或匯編語(yǔ)言。用匯編語(yǔ)言編程,程序的生產(chǎn)效率及質(zhì)量都有所提高。但是匯編語(yǔ)言指令是機(jī)器不能直接識(shí)別、理解和執(zhí)行的。用它編寫的程序經(jīng)檢查無(wú)誤后,要先翻譯成機(jī)器語(yǔ)言程序才能被機(jī)器理解、執(zhí)行。這個(gè)翻譯轉(zhuǎn)換過(guò)程稱為“代真”。代真后得到的機(jī)器語(yǔ)言程序稱為目標(biāo)程序(objectprogram),代真以前的程序,稱為源程序(sourceprogram)。由于匯編語(yǔ)言指令與機(jī)器語(yǔ)言指令基本上具有一一對(duì)應(yīng)的關(guān)系,所以匯編語(yǔ)言源程序的代真可以由匯編系統(tǒng)以查表的方式進(jìn)行。匯編語(yǔ)言與機(jī)器語(yǔ)言,都是依CPU的不同而異,它們都稱為面向機(jī)器的語(yǔ)言。用面向機(jī)器的語(yǔ)言編程,可以編出效率極高的程序。但是程序員用它們編程時(shí),不僅要考慮解題思路,還要熟悉機(jī)器的內(nèi)部結(jié)構(gòu),并且要“手工”地進(jìn)行存儲(chǔ)器分配。這種編程的勞動(dòng)強(qiáng)度仍然很大,給計(jì)算機(jī)的普及推廣造成很大的障礙。

3.高級(jí)語(yǔ)言匯編語(yǔ)言和機(jī)器語(yǔ)言是面向機(jī)器的,不同類型的計(jì)算機(jī)所用的匯編語(yǔ)言和機(jī)器語(yǔ)言是不同的。1954年出現(xiàn)的FORTRAN語(yǔ)言以及隨后相繼出現(xiàn)的其它高級(jí)語(yǔ)言,開始使用接近人類自然語(yǔ)言的、但又消除了自然語(yǔ)言中的二義性的語(yǔ)言來(lái)描述程序。這些高級(jí)語(yǔ)言使人們開始擺脫進(jìn)行程序設(shè)計(jì)必須先熟悉機(jī)器的桎梏,把精力集中于解題思路和方法上。第一種高級(jí)語(yǔ)言是1954年問世的FORTRAN語(yǔ)言。此后不久,不同風(fēng)格、不同用途、不同規(guī)模、不同版本的面向過(guò)程的高級(jí)語(yǔ)言便風(fēng)涌而起。據(jù)統(tǒng)計(jì),全世界已有2500種以上的計(jì)算機(jī)語(yǔ)言,其中使用較多的有近百種。圖1.5為幾種廣泛流行的高級(jí)語(yǔ)言的發(fā)展變遷情況。5254565860626466687072747678808284868890929496AdaALGOL60ALGOL68PascalModula-2CPLBCPLBCC++JavaLISPPROLOGCOBOLFORTRAN77FORTRANPL/1Simula67Smalltalk80BASICANSI-BASICQBASICVBFORTRAN90<>圖1.5幾種廣泛流行的高級(jí)語(yǔ)言的發(fā)展變遷情況

1.1.3高級(jí)語(yǔ)言程序的開發(fā)過(guò)程一般來(lái)說(shuō),程序開發(fā)的一般過(guò)程有如圖1.6所示幾個(gè)步驟圖1.6高級(jí)語(yǔ)言程序的開發(fā)過(guò)程

1.分析一般來(lái)說(shuō),一個(gè)具體的問題要涉及許許多多的方面,這是問題的復(fù)雜性所在。為了便于求解,往往要忽略一些次要方面。這種通過(guò)忽略次要方面,而找出解題規(guī)律,就稱為建立模型。

2.建立模型,表現(xiàn)模型表現(xiàn)模型就是用一種符號(hào)-語(yǔ)言系統(tǒng)來(lái)描述模型。一般來(lái)說(shuō),模型的表現(xiàn)會(huì)隨著對(duì)問題抽象程度的加深和細(xì)化,不斷由領(lǐng)域特色向計(jì)算機(jī)可解釋、執(zhí)行靠近,中間也可能采用一些其他的符號(hào)系統(tǒng),如流程圖等,直到最后用一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言描述出來(lái)。

3.源程序的編輯源程序的編輯就是在某種字處理環(huán)境下,用具體的程序設(shè)計(jì)語(yǔ)言書寫并修改的過(guò)程。為此就要掌握一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。還要應(yīng)用一種專用程序編輯器或通用的文字編輯器進(jìn)行。

4.程序的編譯(或解釋)與鏈接寫出一個(gè)高級(jí)語(yǔ)言程序后,并不是就可以立即拿來(lái)執(zhí)行。要讓機(jī)器直接執(zhí)行,還要將它翻譯成由機(jī)器可以直接辨認(rèn)并可以執(zhí)行的機(jī)器語(yǔ)言程序。為區(qū)別它們,把用高級(jí)語(yǔ)言寫的程序(文件)稱為源程序(文件),把機(jī)器可以直接辨認(rèn)并執(zhí)行的程序(文件)稱為可執(zhí)行程序(文件)。這一過(guò)程一般分為兩步:第1步:在程序編輯過(guò)程中輸入到源文件中的是一些字符碼,但是機(jī)器可以直接處理的是0、1信息。為此,首先要將源程序文件翻譯成0、1碼表示的信息,并用相應(yīng)的文件保存。這種保存0、1碼信息的文件稱為目標(biāo)程序文件。由源文件翻譯成目標(biāo)文件的過(guò)程稱為編譯。在編譯過(guò)程中,還要對(duì)源程序中的語(yǔ)法和邏輯結(jié)構(gòu)進(jìn)行檢查。編譯任務(wù)是由稱做編譯器(compiler)的軟件完成的。目標(biāo)程序文件還不能被執(zhí)行,它們只是一些目標(biāo)程序模塊。第2步:將目標(biāo)程序模塊以及程序所需的系統(tǒng)中固有的目標(biāo)程序模塊(如執(zhí)行輸入輸出操作的模塊)鏈接成一個(gè)完整的程序。經(jīng)正確鏈接所生成的文件才是可執(zhí)行文件。完成鏈接過(guò)程的軟件稱為鏈接器(linker)。圖1.7為編譯和鏈接過(guò)程的示意圖。程序在編譯、鏈接過(guò)程中,也可能發(fā)現(xiàn)錯(cuò)誤。這時(shí)要重新進(jìn)入編輯器進(jìn)行編輯。圖1.7編譯和鏈接過(guò)程的示意圖

5.程序的測(cè)試與調(diào)試經(jīng)編譯、鏈接的程序文件,生成可執(zhí)行文件,就可以讓計(jì)算機(jī)執(zhí)行了。但是,并不是就可以得到預(yù)期的結(jié)果而交付用戶使用了,因?yàn)槌绦蛉匀粫?huì)存在某些錯(cuò)誤。因此,每一個(gè)人編寫出一個(gè)程序后,在正式交付使用前,總要試通一下?!霸囃ā本褪窃囘\(yùn)行程序,也就是對(duì)程序進(jìn)行測(cè)試。測(cè)試是以程序通過(guò)編譯、沒有語(yǔ)法和鏈接上的錯(cuò)誤為前提,目的是找出程序中可能存在的錯(cuò)誤并加以改正。因此,應(yīng)該測(cè)試程序在不同情況下運(yùn)行的情況,輸入不同的數(shù)據(jù)可以檢測(cè)出程序在不同情況下運(yùn)行的情況。測(cè)試的數(shù)據(jù)應(yīng)是以“程序是會(huì)有錯(cuò)誤的”為前提精心設(shè)計(jì)出來(lái)的,而不是隨心所欲地亂湊而成的。它不僅應(yīng)含有被測(cè)程序的輸入數(shù)據(jù),而且還應(yīng)包括程序執(zhí)行它們后預(yù)期的結(jié)果。每次測(cè)試都要把實(shí)際的結(jié)果與預(yù)期的結(jié)果相比較,以觀察程序是否出錯(cuò)。

6.編寫程序文檔經(jīng)過(guò)了問題分析、設(shè)計(jì)、程序編碼、測(cè)試后,程序開發(fā)的工作基本上結(jié)束了。但是,這時(shí)還不能交付使用。因?yàn)?,隨著程序規(guī)模的增大和日益復(fù)雜化,程序的使用和運(yùn)行也越來(lái)越不那么直接,用戶要運(yùn)行程序,還需要知道許多信息,如:

●程序的功能

●需要輸入的數(shù)據(jù)類型、格式和取值范圍

●需要使用的文件數(shù)量、名稱、內(nèi)容以及存放位置等

●程序運(yùn)行需要的軟、硬件環(huán)境

●程序的裝入、啟動(dòng)方法以及交互方式等。為此,程序開發(fā)者需要向用戶提供這些資料——稱為程序使用說(shuō)明書或用戶文檔。需要說(shuō)明的是,在許多軟件中,這些內(nèi)容已經(jīng)部分或全部地以“readme”或“help”的形式提供。目前,程序文檔已經(jīng)成為軟件開發(fā)產(chǎn)品的必要部分。文檔在程序使用和維護(hù)中的重要性也改變了軟件的概念,使之由早期的“軟件是計(jì)算機(jī)程序的總稱”演化為“軟件是計(jì)算機(jī)的程序連同計(jì)算機(jī)化的文檔的總稱?!?.程序的維護(hù)程序交付用戶使用之后,并不是萬(wàn)事大吉了。由于多種原因,還可能要對(duì)程序進(jìn)行修改。交付之后對(duì)程序的修改稱為程序的維護(hù)。維護(hù)程序的原因主要有:

●原來(lái)的程序沒有完全滿足用戶要求;

●用戶要求的改變;

●程序中遺留有錯(cuò)誤,在運(yùn)行中被發(fā)現(xiàn)。程序的維護(hù)可以由開發(fā)者進(jìn)行,也可能是由別人進(jìn)行。為能便于程序的維護(hù),開發(fā)者應(yīng)當(dāng)提供必要的技術(shù)資料,并且要保證程序的可讀好——能讓人看懂。1.2C語(yǔ)言及其標(biāo)準(zhǔn)1.2.1C語(yǔ)言的出現(xiàn)

C語(yǔ)言是目前程序設(shè)計(jì)領(lǐng)域中最有影響力的一種程序設(shè)計(jì)語(yǔ)言。可是,它卻是“漫不經(jīng)心”地開發(fā)出來(lái)的。

20世紀(jì)60年代,Bell實(shí)驗(yàn)室的KenThompson(見圖1.8)著手開發(fā)后來(lái)對(duì)計(jì)算機(jī)產(chǎn)生了巨大影響的UNIX操作系統(tǒng)。為了描述UNIX,Thompson首先將當(dāng)時(shí)的一種專門用來(lái)描述系統(tǒng)程序的BCPL語(yǔ)言改進(jìn)為他稱為B的語(yǔ)言。1970年Thompson發(fā)表了用匯編語(yǔ)言和B語(yǔ)言寫成的PDP-7上實(shí)現(xiàn)UNIX的初版。

1971年,DennisRitchie(見圖1.8)開始協(xié)助Thompson開發(fā)UNIX。他對(duì)B語(yǔ)言做了進(jìn)一步的充實(shí)和完善,加入數(shù)據(jù)類型和新的句法,于1972年推出了一種新型程序設(shè)計(jì)語(yǔ)言——C語(yǔ)言(取BCPL的第2個(gè)字母)。為了使UNIX操作系統(tǒng)推廣,1977年DennisM.Ritchie

發(fā)表了不依賴于具體機(jī)器系統(tǒng)的C語(yǔ)言編譯文本《可移植的C語(yǔ)言編譯程序》。于是,C語(yǔ)言是借助UNIX操作系統(tǒng)的翅膀而起飛的,UNIX操作系統(tǒng)也由于C而得已快速移植落地生根,兩者相輔相承,成就了軟件開發(fā)史上歷時(shí)30年的時(shí)代。

1978年BrianW.Kernighian和DennisM.Ritchie出版了名著《TheCProgrammingLanguage》,從而使C語(yǔ)言成為目前世界上流行最廣泛的高級(jí)程序設(shè)計(jì)語(yǔ)言。以后,又有多種程序設(shè)計(jì)語(yǔ)言在C語(yǔ)言的基礎(chǔ)上產(chǎn)生,如C++、VisualC++、Java、C#等。圖1.8Thompson(左)和Ritchie(中)于1999

年接受當(dāng)時(shí)美國(guó)總統(tǒng)克林頓授予的國(guó)家技術(shù)勛章1.2.2C語(yǔ)言的標(biāo)準(zhǔn)

C語(yǔ)言的靈活性、豐富性、可移植性很快得到了普遍的承認(rèn),接著適合于各種不同操作系統(tǒng)(UNIX,MS-DOS,CP/M-80,86等)和不同機(jī)種(字長(zhǎng)為8bit~32bit)的C語(yǔ)言編譯系統(tǒng)相繼出現(xiàn)。1982年美國(guó)國(guó)家標(biāo)準(zhǔn)局(ANSI)語(yǔ)言標(biāo)準(zhǔn)化委員會(huì)成立了一個(gè)委員會(huì)開始著手進(jìn)行C語(yǔ)言的標(biāo)準(zhǔn)化工作,并于1983年公布了第一個(gè)C語(yǔ)言標(biāo)準(zhǔn)草案(83ANSIC)。1989年,ASNI又發(fā)布了一個(gè)完整的C語(yǔ)言標(biāo)準(zhǔn)——ANSIX3.159-1989,通常稱做“ANSIC”,簡(jiǎn)稱“C89”。1990年,國(guó)際標(biāo)準(zhǔn)組織ISO/JECJTC1/SC22/WG14采納了C89,做了少編輯性修改后,以國(guó)際標(biāo)準(zhǔn)ISO/IEC9899:1990發(fā)布,通常稱其為“C90”,它同C89基本相同。

1995年,WG14對(duì)C89做了兩處技術(shù)修訂和一個(gè)擴(kuò)充。人們將其稱為“C89增補(bǔ)1”或“C95”。同時(shí),WG14開始著手對(duì)C標(biāo)準(zhǔn)做全面修訂,并于1999年完成獲得通過(guò),形成正式的C語(yǔ)言標(biāo)準(zhǔn),命名為ISO/IEC9899:1999,簡(jiǎn)稱“C99”。本書將基于C99介紹C語(yǔ)言程序設(shè)計(jì)的基本方法。目前各廠家所提供的所有C編譯系統(tǒng)都還未實(shí)現(xiàn)C99所建議的功能。為了讀者能實(shí)際運(yùn)行C程序,本書所介紹的程序都是符合ASNIC標(biāo)準(zhǔn)并能在大多數(shù)C編譯系統(tǒng)通過(guò)和運(yùn)行的程序。但在文字?jǐn)⑹鲋?,?huì)介紹C99所增加的新功能,以使讀者今后能順利地過(guò)渡到用C99編程。1.3C語(yǔ)言概要1.3.1函數(shù)任何一部機(jī)器都是用部件組裝而成的。計(jì)算機(jī)程序和機(jī)器一樣,也是由一些部件構(gòu)建起來(lái)的。C語(yǔ)言程序部件是函數(shù)。也就是說(shuō),設(shè)計(jì)C語(yǔ)言程序就是設(shè)計(jì)它的構(gòu)成函數(shù)。下面舉例說(shuō)明C語(yǔ)言程序中的函數(shù)是什么樣的。例1.1一個(gè)輸出一串字符的C程序。/*文件名:ex010101.c*/#include<stdio.h>int

main(void){

printf("Programmingisfun.");//輸出一串字符

return0;/*向操作系統(tǒng)返回一個(gè)數(shù)字0*/}這是一個(gè)非常簡(jiǎn)單的C語(yǔ)言程序,它的執(zhí)行結(jié)果是顯示一行字符:

Programmingisfun.說(shuō)明:(1)這里

intmain(void){ …}是一個(gè)函數(shù)。這個(gè)函數(shù)的名字為“main”。這個(gè)名字是專用的,表示這個(gè)函數(shù)是“主函數(shù)”。所謂主函數(shù),就是執(zhí)行這個(gè)程序時(shí),由操作系統(tǒng)直接調(diào)用的函數(shù)。每一個(gè)C語(yǔ)言程序必須也只能有一個(gè)主函數(shù)。(2)函數(shù)名后面的圓括號(hào)用于表示參數(shù)。一般說(shuō)來(lái),用函數(shù)進(jìn)行計(jì)算,需要給定參數(shù)。但是廣義的計(jì)算也可以沒有參數(shù)而只執(zhí)行一個(gè)過(guò)程。在C語(yǔ)言程序中,參數(shù)部分寫為“void”,表示該函數(shù)沒有參數(shù),只執(zhí)行一個(gè)過(guò)程?!皏oid”可以省寫,如程序第一行可寫為:

intmain()

在許多教材和程序中,可以常常見到這種形式的主函數(shù)首行。但是,C標(biāo)準(zhǔn)建議寫上void,使含義清晰。在本書的程序中都是寫成main(void)形式的。(3)再后面的一對(duì)花括號(hào)中的部分稱為函數(shù)體,用來(lái)表明該函數(shù)的功能是如何實(shí)現(xiàn)的。通常,函數(shù)體用一些語(yǔ)句表述。C語(yǔ)言規(guī)定語(yǔ)句必須用分號(hào)結(jié)束。先分析下面的語(yǔ)句:

printf(″Programmingisfun.″);

它的功能是調(diào)用編譯系統(tǒng)提供的函數(shù)庫(kù)中的一個(gè)函數(shù)printf(),來(lái)輸出后面的一串字符。函數(shù)printf的使用比較復(fù)雜,后面將陸續(xù)介紹。(4)函數(shù)名前面的“int”表明函數(shù)的返回值是一個(gè)整數(shù)。有的操作系統(tǒng)(如Unix)要求在執(zhí)行一個(gè)程序后應(yīng)向系統(tǒng)返回一個(gè)整數(shù)值,如程序正常執(zhí)行和結(jié)束,應(yīng)返回0,否則返回一個(gè)非0值。因此,需要將main函數(shù)指定為int(整型),同時(shí)在函數(shù)體的最后寫一返回語(yǔ)句:

return0;

它的功能是向調(diào)用者(操作系統(tǒng))返回0值,表示主函數(shù)正常結(jié)束(也就是程序正常結(jié)束)。此語(yǔ)句必須寫在函數(shù)體的最后一行才有意義,因?yàn)橹灰獔?zhí)行到這條語(yǔ)句,就表達(dá)程序正常結(jié)束,向操作系統(tǒng)返回一個(gè)0,如果程序未執(zhí)行到這個(gè)返回語(yǔ)句就非正常結(jié)束了,就不會(huì)向操作系統(tǒng)返回0。操作系統(tǒng)會(huì)據(jù)此作出相應(yīng)的處理。有的操作系統(tǒng)(如DOS,Windows)并無(wú)程序必須返回整數(shù)的要求,因此,可以不指定main函數(shù)為整型。這時(shí)可在main函數(shù)的前面加上void,如∶

voidmain(void)或voidmain()

表示main函數(shù)是無(wú)類型的,不返回任何類型的值。顯然在main函數(shù)的最后也不必寫返回語(yǔ)句“return0;”。讀者可以在其他教材或程序中看到這種形式的main函數(shù)。以上兩種用法都是是合法的、有效的,編程者可以根據(jù)情況決定。為了使程序具有一般性,采用以下形式∶

intmain(void)

并在函數(shù)體最后有“return0;”語(yǔ)句。(5)程序最前面的

#include<stdio.h>是一種在程序編譯之前要處理的內(nèi)容,稱為編譯預(yù)處理命令。編譯預(yù)處理命令還有一些,它們都用“#”開頭,并且不用分號(hào)結(jié)束,所以不是C語(yǔ)言的語(yǔ)句。這里的編譯預(yù)處理命令稱為文件包含命令,它的作用是在編譯之前把程序中需要使用關(guān)于系統(tǒng)定義的函數(shù)printf()的一些信息文件stdio.h包含進(jìn)來(lái)。用“.h”作為后綴的文件稱為頭文件。(6)“/*…*/”中的文字用于做一些說(shuō)明——注釋,讓讀程序的人容易讀懂。例如,注釋

/*文件名:ex1_01.c*/是告訴讀程序的人,這個(gè)程序的源代碼用文件ex1_01保存。而其他兩個(gè)注釋是對(duì)其左面兩條語(yǔ)句功能的說(shuō)明。上面的程序只由一個(gè)函數(shù)組成(在主函數(shù)中又調(diào)用了庫(kù)函數(shù)printf()。在例1.2中將介紹由兩個(gè)函數(shù)組成的程序。例1.2計(jì)算兩個(gè)整數(shù)(2,3)相加的結(jié)果/*文件名:ex010201.c*/#include<stdio.h>intadd(int,int); /*聲明后面將要使用函數(shù)add()*/intmain(void){ints; /*聲明后面使用的變量s是整型的*/s=add(2,3); /*調(diào)用add()進(jìn)行計(jì)算,并用s接收*/

printf("Thesumis:%d",s); /*輸出s的值 */return0;}intadd(int

a,intb) /*函數(shù)add()的定義 */{intsum; /*定義一個(gè)整數(shù)sum,用于存放和*/sum=a+b; /*將a和b求和,并把結(jié)果送sum*/returnsum; /*返回sum的值到調(diào)用者*/}說(shuō)明(1)圖1.9表明了該程序的執(zhí)行過(guò)程。為了清晰,僅列出了執(zhí)行語(yǔ)句。將2和3傳遞給a和bex1_02.exemain(){s=add(2,3);printf(“Thesumis%d”,s);return0;}操作系統(tǒng)add(inta,intb){

sum=a+b;

returnsum;}編譯系統(tǒng)提供庫(kù)函數(shù)printf

進(jìn)行計(jì)算并輸出結(jié)果①操作系統(tǒng)調(diào)用main()②計(jì)算a+b返回sum的值到調(diào)用處③返回操作系統(tǒng)④圖1.9程序ex1_02的執(zhí)行過(guò)程

①經(jīng)過(guò)編譯、鏈接后的C語(yǔ)言程序就成為一個(gè)可執(zhí)行文件。例如,程序的ex1_02的默認(rèn)可執(zhí)行文件名為“ex1_02.exe”。若要執(zhí)行這個(gè)程序,只要在操作系統(tǒng)的命令執(zhí)行環(huán)境中打入這個(gè)文件名,系統(tǒng)就會(huì)開始執(zhí)行這個(gè)程序。對(duì)于C語(yǔ)言程序而言,首先從調(diào)用主函數(shù)開始。②在主函數(shù)main中,第一個(gè)語(yǔ)句是

s=add(2,3);但是,這個(gè)語(yǔ)句的執(zhí)行要分如下步驟才能完成。

調(diào)用函數(shù)add(),同時(shí)將數(shù)據(jù)2和3分別傳送給函數(shù)add()中的變量a和b;

使用表達(dá)式a+b進(jìn)行加法計(jì)算。

將和用“=”賦給函數(shù)add()中的變量sum中。注意“=”是賦值操作符,不是等號(hào)。C語(yǔ)言中的等號(hào)是“==”。

用return語(yǔ)句將sum的值返回的函數(shù)add()的調(diào)用處。

將函數(shù)add()的返回值送給主函數(shù)中的變量s。③執(zhí)行函數(shù)printf(),輸出下面的內(nèi)容:

Thesumis5這個(gè)語(yǔ)句的執(zhí)行也需要如下多個(gè)步驟才能實(shí)現(xiàn):

圓括號(hào)中的引號(hào)中的“Thesumis:”要求原樣輸出。

圓括號(hào)中的引號(hào)中的“%”表示后面的字符“d”是一個(gè)格式字符,要求將雙引號(hào)后面的表達(dá)式的值,按照整型數(shù)據(jù)輸出。

函數(shù)printf()將流程返回到調(diào)用處。printf()也有返回值(成功返回輸出的字符個(gè)數(shù);失敗時(shí),返回一個(gè)負(fù)整數(shù)),但是一般不用。④執(zhí)行main()中的返回語(yǔ)句return,用“0”向操作系統(tǒng)送回“平安”信號(hào)。(2)變量及其類型本例中的s和sum都稱為變量。變量是程序中被命名的數(shù)據(jù)實(shí)體,并且它的值是可以改變的。同時(shí),為了便于計(jì)算與存儲(chǔ),C語(yǔ)言中程序中所使用的每個(gè)數(shù)據(jù)都被規(guī)范化了。這種數(shù)據(jù)的規(guī)范稱為數(shù)據(jù)類型。本例中使用語(yǔ)句

ints;和

intsum;的作用就是聲明了兩個(gè)變量s和sum名字和類型(用“int”表明它們是整型數(shù)據(jù))。變量在使用之前都要先行聲明。(3)函數(shù)的聲明本例中的

int

add(int,int);稱為函數(shù)聲明。函數(shù)聲明的作用是讓編譯器知道該函數(shù)的原型(包括返回類型、參數(shù)個(gè)數(shù)和類型,以便對(duì)調(diào)用語(yǔ)句進(jìn)行語(yǔ)法檢查。如果定義在調(diào)用前,從定義可以直接獲得這些信息,就可以不寫聲明;如果調(diào)用在定義之前,則需要一個(gè)原型聲明說(shuō)明這些信息。對(duì)于編譯系統(tǒng)提供的庫(kù)函數(shù),它們的定義不在程序中,因此需要給出相應(yīng)的原型聲明。為了方便使用,系統(tǒng)把某些類型的庫(kù)函數(shù)的原型聲明寫在某個(gè)頭文件中,程序員只要把要求的頭文件用文件包含語(yǔ)句寫在程序中函數(shù)調(diào)用之前,就等于把原型聲明寫在了函數(shù)調(diào)用之前。這就是使用函數(shù)printf(),必須在其前寫一條#include<stdio.h>的原因。(4)關(guān)于printf()函數(shù)的參數(shù)

printf()函數(shù)的參數(shù)有兩部分:前面的用雙引號(hào)引起的部分稱為“控制串”。控制串由一些字符組成,這些字符可以分成兩類:第一類字符可以直接顯示出來(lái),第二類字符作為格式說(shuō)明符使用?;蛘哒f(shuō),除了格式說(shuō)明符之外的字符,都是可以直接顯示的。格式說(shuō)明符是由“%”開頭,后面跟著的是格式碼。本例中的“d”就是格式碼,它后面輸出的數(shù)據(jù)按照帶符號(hào)十進(jìn)制輸出。其他格式說(shuō)明符將陸續(xù)介紹。(5)關(guān)于賦值運(yùn)算在C語(yǔ)言中,符號(hào)“=”稱為賦值運(yùn)算符,它的作用是把后面(右面)的值,送到其前(左面)的變量(左值)中。一定不要將其當(dāng)作是等號(hào)。在C語(yǔ)言中,等號(hào)是“==”。例1.3計(jì)算一個(gè)數(shù)的正弦值的C語(yǔ)言程序。#include<stdio.h>#include<math.h>int

main(void){floatx; /*定義x為實(shí)型變量*/x=sin(0.19199); /*調(diào)用sin函數(shù)*/

printf("%f\n",x);//調(diào)用printf函數(shù),輸出x的值}程序的執(zhí)行結(jié)果如下:0.190813說(shuō)明:

(1)“floatx;”是聲明:x是一個(gè)實(shí)型變量。(2)“x=sin(0.19199)”可執(zhí)行一次函數(shù)調(diào)用,求出0.19199弧度的正弦值,并賦給實(shí)型變量x。sin()是一個(gè)庫(kù)函數(shù),math.h是其要求的頭文件。(3)printf()中的格式說(shuō)明符“%f”,指定一個(gè)實(shí)型格式輸出(前面介紹的%d是整型數(shù)據(jù)格式符)。通常輸出的數(shù)據(jù)在小數(shù)后有6位數(shù)字;小數(shù)點(diǎn)前的數(shù)字位數(shù)不指定,根據(jù)實(shí)際值的位數(shù)輸出。格式說(shuō)明符的類型要與后面要輸出的數(shù)據(jù)類型相一致。(4)printf()中的“\n”稱為轉(zhuǎn)義字符序列,前面加了反斜桿后,“n”不再作為字符,而是作為一條換行命令使用。轉(zhuǎn)義字符還有一些,以后陸續(xù)介紹。

從這一小節(jié)可以得出如下結(jié)論:

C語(yǔ)言程序是由函數(shù)組成的。

●設(shè)計(jì)C語(yǔ)言程序時(shí),一個(gè)必須設(shè)計(jì)的函數(shù)是主函數(shù)。C語(yǔ)言的執(zhí)行是從系統(tǒng)調(diào)用主函數(shù)開始的。

●主函數(shù)的部分功能也可以通過(guò)其他子函數(shù)補(bǔ)充實(shí)現(xiàn)。子函數(shù)應(yīng)當(dāng)首選從函數(shù)庫(kù)中的函數(shù);函數(shù)庫(kù)中沒有時(shí)??梢钥紤]自行設(shè)計(jì)。

●使用庫(kù)函數(shù)時(shí),要用文件包含命令將需要的頭文件包含到程序中調(diào)用該庫(kù)函數(shù)之前。1.3.2C語(yǔ)言的標(biāo)準(zhǔn)由前一小節(jié)中的例子可以看出,在C語(yǔ)言程序中,函數(shù)下面的組成單位是語(yǔ)句。在C99中,基本的語(yǔ)句有表達(dá)式語(yǔ)句、流程控制語(yǔ)句和塊語(yǔ)句。1.表達(dá)式語(yǔ)句

C語(yǔ)言程序的具體計(jì)算過(guò)程是由表達(dá)式完成的。表達(dá)式是由運(yùn)算符(如上述+,=等)、變量(如上述s,sum,a,b,x等)和常量(如上述2,3,0.19199等)組成。前面使用過(guò)的

s=add(2,3)sum=a+bx=sin(0.19199)都是表達(dá)式。表達(dá)式加上語(yǔ)句結(jié)束符(分號(hào))就構(gòu)成表達(dá)式語(yǔ)句。學(xué)習(xí)C語(yǔ)言程序設(shè)計(jì),必須掌握正確地使用變量、常量和運(yùn)算符的表示方法和使用規(guī)則。變量和常量的使用涉及它們的數(shù)據(jù)類型、表示(命名)規(guī)則等,后面要專門介紹。

C語(yǔ)言中的運(yùn)算符種類很多,正確地使用這些運(yùn)算符,有三點(diǎn)需要注意:

它們的含義。特別要區(qū)分一個(gè)運(yùn)算符符號(hào)在C語(yǔ)言中和在普通數(shù)學(xué)中的意義的不同。如“=”。

優(yōu)先級(jí),即在一個(gè)表達(dá)式中存在多個(gè)運(yùn)算符時(shí),進(jìn)行運(yùn)算的先后順序。

結(jié)合性,即在一個(gè)表達(dá)式中有多個(gè)優(yōu)先級(jí)別相同的運(yùn)算符時(shí),先進(jìn)行哪個(gè)運(yùn)算符的運(yùn)算。例如,在表達(dá)式2*3/5(在C語(yǔ)言中,“*”為乘運(yùn)算符?!?”為除運(yùn)算符)中,先進(jìn)行除呢,還是先進(jìn)行乘。在這個(gè)表達(dá)式中,好像對(duì)運(yùn)算結(jié)果沒有影響,但有時(shí)是有影響的。關(guān)于這些問題,后面將專門介紹。2.流程控制語(yǔ)句一般說(shuō)來(lái),程序中的語(yǔ)句是按照書寫順序執(zhí)行的。但是,有些情況下,需要改變默認(rèn)的執(zhí)行順序,例如像圖1.10(a)那樣要從兩個(gè)或多個(gè)語(yǔ)句中挑選一個(gè)語(yǔ)句執(zhí)行,或者像圖1.10(b)那樣要重復(fù)執(zhí)行某一個(gè)語(yǔ)句或語(yǔ)句塊。前者稱為選擇控制,后者稱為重復(fù)控制。

(a)選擇結(jié)構(gòu)(b)重復(fù)結(jié)構(gòu)

圖1.10兩種基本的流程控制結(jié)構(gòu)下面給出兩個(gè)實(shí)例。例1.4由鍵盤輸入兩個(gè)數(shù),輸出其中的大數(shù)。本例中函數(shù)max2()的執(zhí)行過(guò)程如圖1.11所示。圖1.11函數(shù)max2()的執(zhí)行過(guò)程程序如下:#include<stdio.h>floatmax2(floatx,floaty){floatmax;

if(x>=y) /*選擇判斷 */max=x; /*條件滿足進(jìn)行的運(yùn)算*/elsemax=y; /*條件不符進(jìn)行的運(yùn)算*/

printf("Themaxis:%f",max);}int

main(void){floata,b;

printf("Inputtworealnumbers:\n");/*輸入提示*/

scanf("%f%f",&a,&b); /*輸入數(shù)據(jù)*/max2(a,b); /*調(diào)用函數(shù)max2()*/return0;}說(shuō)明:(1)本例的函數(shù)max2()中有一個(gè)選擇結(jié)構(gòu),條件是“x>=y”。滿足該條件,則執(zhí)行運(yùn)算max=x;不滿足,則執(zhí)行運(yùn)算max=y。這樣,就在max中保存了x和y中的大者。(2)在主函數(shù)中,函數(shù)scanf(“%f%f”,&a,&b)的功能是從鍵盤上輸入兩個(gè)實(shí)數(shù),分別存放到地址&a和&b中。地址&a和&b是變量a和b地址,“&”是一個(gè)運(yùn)算符。用于計(jì)算其后面變量的地址。(3)在函數(shù)scanf(“%f%f”,&a,&b)中,“%f”表示要輸入的數(shù)據(jù)是實(shí)型數(shù)據(jù)。也就是說(shuō),格式說(shuō)明符的類型,要與輸入數(shù)據(jù)的類型一致。另外,鍵入的兩個(gè)數(shù)據(jù)之間應(yīng)當(dāng)以空格、制表符(按Tab鍵)或回車分隔。程序運(yùn)行時(shí)的情形如下:

Inputtworealnumbers:1.2352.345Themaxis:2.345例1.5求累加和的值。程序如下:#include<stdio.h>int

sigma(intn){inti=0,sum=0;

while(i<=n){ sum=sum+i;i++; } returnsum;}int

main(void){int

m,total;

scanf("%d",&m);total=sigma(m);

printf("total=%d\n",total);return0;}說(shuō)明:(1)聲明

inti=0,sum=0;

有兩個(gè)功能:一是定義了兩個(gè)整型變量;二是對(duì)兩個(gè)整型變量設(shè)定了初值。這稱為變量的初始化。變量在沒有初始化時(shí)并且也沒有執(zhí)行賦值操作之前,其值是不確定的。為了避免使用這些不確定的值,應(yīng)當(dāng)盡量在變量定義的同時(shí)對(duì)其進(jìn)行初始化。一般說(shuō)來(lái),存放和的變量的初始值應(yīng)當(dāng)為0,而存放積的變量的初始值應(yīng)當(dāng)為1。

(2)在本例中,函數(shù)sigma()用來(lái)計(jì)算。計(jì)算的方法是:先設(shè)置sum的初值為0、i的初值為0。先執(zhí)行sum=sum+i。然后用表達(dá)式“i++”將自增1,相當(dāng)于執(zhí)行操作:i=i+1每執(zhí)行一次i的自增1,

用流程圖表示如圖1.12所示。i<=nsum=sum+

i是否i=0,sum=0i++returnsum圖1.12

函數(shù)sigma()的執(zhí)行過(guò)程

除了上述兩種控制語(yǔ)句外,C語(yǔ)言還提供了其他一些控制語(yǔ)句,以后會(huì)專門介紹。3.塊語(yǔ)句塊語(yǔ)句也稱為復(fù)合語(yǔ)句,就是用一對(duì)花括號(hào)將一組語(yǔ)句括起來(lái)。在一個(gè)塊語(yǔ)句中可以包括若干聲明和若干語(yǔ)句。在例1.8的函數(shù)sigma()中,while下面的用花括號(hào)括起的兩個(gè)語(yǔ)句,就組成一個(gè)塊語(yǔ)句。塊語(yǔ)句在語(yǔ)法上相當(dāng)于一條語(yǔ)句。因此,當(dāng)語(yǔ)法上需要一個(gè)語(yǔ)句,而一個(gè)語(yǔ)句又不能滿足需要時(shí),就必須使用塊語(yǔ)句。

1.3.3名字與聲明1.標(biāo)識(shí)符與關(guān)鍵字標(biāo)識(shí)符也稱為名稱。變量的名字、函數(shù)的名字、文件的名字等,都是關(guān)鍵字。在C語(yǔ)言程序中,所使用的標(biāo)識(shí)符應(yīng)當(dāng)符合如下的詞法規(guī)則:(1)標(biāo)識(shí)符是大小寫字母、數(shù)字和下劃線組成的序列,但不能以數(shù)字開頭。例如,下面是合法的C標(biāo)識(shí)符:

aAAb_Ax_aX

A_x

abcd

但是下列不是合法的C標(biāo)識(shí)符:

5_A(數(shù)字打頭)A-3(含非法字符)(2)C語(yǔ)言區(qū)別同一字母的大小寫,如abc與abC被看作識(shí)不同的名標(biāo)識(shí)符。(3)C89要求C編譯器能識(shí)別的標(biāo)識(shí)符長(zhǎng)度為不少于31個(gè)有效字符,C99要求C編譯器能識(shí)別的標(biāo)識(shí)符長(zhǎng)度為不少于63個(gè)有效字符。一個(gè)標(biāo)識(shí)符中超過(guò)了這個(gè)長(zhǎng)度的字符可能會(huì)不被辨認(rèn)。例如在符合C99的系統(tǒng)中,當(dāng)兩個(gè)標(biāo)識(shí)符的前63個(gè)字符都相同時(shí),不管后面的有效字符是否相同,都可能被當(dāng)作同一個(gè)標(biāo)識(shí)符。(4)普通標(biāo)識(shí)符不能使用對(duì)于系統(tǒng)有特殊意義的名稱。這些對(duì)系統(tǒng)有特殊意義的名稱稱為關(guān)鍵字。表1.1為C99關(guān)鍵字。auto_Boolbreakcasechar_Complexconstcontinuedefaultdodoubleelseenumexternfloatforgotoif_Imaginaryinlineintlongregisterrestrictreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile表1.1C99關(guān)鍵字在一個(gè)程序中,往往要使用大量的名字。大量的名字的使用,可能會(huì)造成名字的沖突和使用錯(cuò)誤。為此,除了上述詞法規(guī)則外,人們還總結(jié)了在程序中使用“好”名字的一些原則:(1)盡量做到“見名知義”,以增加程序的可讀性。(2)盡量避免使用容易混淆的字符,例如

0(數(shù)字)、O(大寫字母)、o(小寫字母)、1(數(shù)字)-I(大寫字母)、i(小寫字母)、2(數(shù)字)、Z(大寫字母)、z(小寫字母)匈牙利前綴數(shù)據(jù)訐類型變量名舉例a或ar數(shù)組arAgebBULL(布爾值)bDone,bbyBYTE(無(wú)符號(hào)字符)byCount,byc或chcharc,chd或dbldoubled,dbl,dCost,dblCostdw或w無(wú)符號(hào)整數(shù)wNumberf或flfloatf,fl,fCost,flCostfn函數(shù)fnFun1h句柄hWndL或llongL,l,lCountm類的數(shù)據(jù)成員n或iintn,i,nCount,iCountp指針pInt,pWnds字符串sNamesz“0”結(jié)束的字符串sz,szMystringx,y無(wú)符號(hào)整型或坐標(biāo)表1.2

部分常用匈牙利前綴

(3)名字不要太短,一般函數(shù)名盡量使用動(dòng)賓結(jié)構(gòu),如PrintCalendar、IsPrime等。(4)許多國(guó)外的Windows程序員還采用匈牙利人CharlesSimonyi提出的將類型作為變量名前綴的命名方法——通常稱為匈牙利命名法。表1.2為部分常用匈牙利前綴。2.聲明在程序中,有許多東西是需要系統(tǒng)為其開辟存儲(chǔ)空間的,例如變量、函數(shù)類型定義等。它們都有自己的名字,并且要在內(nèi)存中獨(dú)立存儲(chǔ),為此可以將它們稱做程序?qū)嶓w。那么,如何建立它們的名字與實(shí)體之間的關(guān)聯(lián)呢?這就是聲明的作用。聲明也稱為說(shuō)明,它的作用非常重要,包括如下一些:●告訴編譯器,一個(gè)名字是與哪個(gè)實(shí)體聯(lián)系,不能張冠李戴●告訴編譯器,也要程序員明白這個(gè)實(shí)體的類型?!窀嬖V編譯器,這個(gè)實(shí)體什么時(shí)候建立?在什么范圍內(nèi)可以使用?前面已經(jīng)使用過(guò)了變量和函數(shù)的聲明。所以,例1.2中的

ints;就是建立變量名s與它的實(shí)體之間的關(guān)聯(lián)。在一個(gè)語(yǔ)句塊中關(guān)于聲明的進(jìn)一步用法,后面還要陸續(xù)介紹。目前要牢記的是,在使用一個(gè)程序?qū)嶓w之前,一定要讓編譯器知道該程序?qū)嶓w的屬性。在C99之前,對(duì)變量和函數(shù)的聲明不作為語(yǔ)句(盡管它們也是用分號(hào)結(jié)尾),它們必須出現(xiàn)在C語(yǔ)句的前面(聲明的位置必須集中寫在語(yǔ)句之前)。C99改變了這一做法,它吸取了C++的做法,聲明不必集中放在執(zhí)語(yǔ)句之前,可以出現(xiàn)在程序中的任意行。這樣,C語(yǔ)句就有執(zhí)行語(yǔ)句和非執(zhí)行語(yǔ)句之分。聲明是非執(zhí)行語(yǔ)句,表達(dá)式語(yǔ)句和流程控制語(yǔ)句是執(zhí)行語(yǔ)句。

1.3.4變量及其賦值1.變量變量(variable)是一種程序?qū)嶓w。它具有一個(gè)值,并且這個(gè)值是可以通過(guò)程序操作改變的。2.變量的賦值運(yùn)算在C語(yǔ)言中,符號(hào)“=”稱為賦值運(yùn)算符,它連接了左右兩個(gè)操作數(shù)(即運(yùn)算量):右操作數(shù)也稱右值,可以是一個(gè)表達(dá)式,左操作數(shù)也稱左值(lvalue),只能是變量。賦值操作的過(guò)程是把右操作數(shù)的值先轉(zhuǎn)換成左操作數(shù)(變量)的類型,并把該值存放到左操作數(shù)(變量)中。例如

inta;

a=2.6;

printf(“%d”,a);結(jié)果為2這是因?yàn)橛?jì)算機(jī)在執(zhí)行上述語(yǔ)句時(shí),首先將2.6舍去小數(shù)部分截尾(truncation)成整型,賦值給變量a。應(yīng)當(dāng)注意,賦值運(yùn)算符是“=”。這個(gè)符號(hào)不是等號(hào)。例如

inta=2,b=3;

a=a+b;的操作是把表達(dá)式a+b的值(2+3)送到(賦值給)變量a。即經(jīng)上述操作后,變量的a的值由2變?yōu)?。圖1.13表明這一操作過(guò)程:先計(jì)算a+b的值,然后把這個(gè)結(jié)果送到變量a中。于是,變量a的值由2變?yōu)?。

23aba+b235運(yùn)算器圖1.13a=a+b的操作過(guò)程賦值運(yùn)算符具有“自右至左”的結(jié)合性,例如

inta=0,b=0,c=0;

a=b=c=5+3;相當(dāng)于

inta,b,c;

a=(b=(c=(5+3)));即先計(jì)算把5+3

的值,得8,賦值給變量c;再把變量c的值(8)賦值給變量b;最后把變量b的值(8)賦值給變量a。圖1.14表明這一操作過(guò)程。執(zhí)行的結(jié)果,a、b、c三個(gè)變量中的值均為8。也就是說(shuō),從一個(gè)變量向另一個(gè)變量賦值后,原來(lái)變量中的值并不會(huì)消失或改變。所以,賦值操作相當(dāng)于拷貝,而不是移動(dòng)。a+b53運(yùn)算器0a0b0ca+b53運(yùn)算器0a0b8c運(yùn)算器0a8b8c運(yùn)算器8a8b8c(c)

執(zhí)行操作b=c=5+3后變量a、b、c的值

(b)執(zhí)行操作c=5+3后變量a、b、c的值

(a)操作前變量a、b、c的值(d)執(zhí)行操作a=b=c=5+3后變量a、b、c的值

圖1.14a=b=c=5+3的操作過(guò)程

1.3.5算術(shù)運(yùn)算算術(shù)運(yùn)算是一切計(jì)算的基礎(chǔ),也是大家都認(rèn)為非常熟悉的。但是對(duì)于高級(jí)程序設(shè)計(jì)語(yǔ)言尤其是C語(yǔ)言中的算術(shù)運(yùn)算符,還需要有一個(gè)再學(xué)習(xí)的過(guò)程。C語(yǔ)言中的算術(shù)運(yùn)算符與普通數(shù)學(xué)中的算術(shù)運(yùn)算符有如下一些不同。

運(yùn)算符符號(hào)有所不同。

種類有所不同。

結(jié)合性可能會(huì)破壞交換率。1.C語(yǔ)言的基本算術(shù)運(yùn)算符

表1.3為C語(yǔ)言中的基本算術(shù)運(yùn)算符及其說(shuō)明。表1.3C語(yǔ)言中的基本算術(shù)運(yùn)算符及其說(shuō)明

運(yùn)算符名稱運(yùn)算對(duì)象功能示例表達(dá)式示例值*乘任何兩個(gè)實(shí)數(shù)或整數(shù)求兩數(shù)之積5.5*4.022.000000/除任何實(shí)數(shù)或整數(shù),但右操作數(shù)不可為0求兩數(shù)之商4.5/50.900000%模兩個(gè)整數(shù),但右操作數(shù)不可為0求整除的余數(shù)13%85+加任何兩個(gè)實(shí)數(shù)或整數(shù)求兩數(shù)之和8+3.511.500000-減任何兩個(gè)實(shí)數(shù)或整數(shù)求兩數(shù)之差10-4.65.400000說(shuō)明:(1)這幾個(gè)算術(shù)運(yùn)算符的運(yùn)算對(duì)象有兩個(gè),所以也稱為雙目算術(shù)運(yùn)算符。(2)這幾個(gè)算術(shù)運(yùn)算符的優(yōu)先級(jí)別為:*、/、%高于+、-。并且它們都比賦值運(yùn)算符的優(yōu)先級(jí)別高。所以,在一個(gè)表達(dá)式中有賦值運(yùn)算符,也有算術(shù)運(yùn)算符時(shí),不使用圓括號(hào),可以先進(jìn)行算術(shù)運(yùn)算,后進(jìn)行賦值運(yùn)算(3)這幾個(gè)算術(shù)運(yùn)算符均為“自左至右”。(4)需要特別注意的是整數(shù)除和模運(yùn)算的結(jié)果都是整數(shù)。

例1.6分析下面的程序的執(zhí)行結(jié)果。/*文件名:ex010601.c*/#include<stdio.h>intmain(void){printf("300*2/3=%d\n",300*2/3);

printf("2/3*300=%d\n",2/3*300);return0;}觀察上面的程序,按照交換率,似乎它們的計(jì)算結(jié)果應(yīng)該相同。但是,非常遺憾!結(jié)果完全不同:

300*2/3=200

2/3*300=0原因在于算術(shù)運(yùn)算符具有自左至右的結(jié)合性,即對(duì)于第1個(gè)表達(dá)式語(yǔ)句,執(zhí)行的順序?yàn)椋?/p>

300*2=600,600/3=200對(duì)于第2個(gè)表達(dá)式語(yǔ)句,執(zhí)行的順序則為:

2/3=0(注意是整數(shù)相除),0*300=0因此,使用整數(shù)除,應(yīng)當(dāng)特別小心。2.自反算術(shù)賦值運(yùn)算符前面介紹過(guò)這樣的賦值表達(dá)式:

a=a+b它的作用是將變量a的值加上變量b的值,再送回到變量a中?;蛘哒f(shuō)是將變量a的值增加一個(gè)變量b的值。這樣類似的運(yùn)算很多。為此C語(yǔ)言為這種運(yùn)算提供了一種簡(jiǎn)潔形式:

a+=b這樣,就可以用一個(gè)復(fù)合運(yùn)算符代替原來(lái)的兩個(gè)運(yùn)算符。這種復(fù)合運(yùn)算符稱為自反算術(shù)賦值運(yùn)算符。除自反加以外,還有下列一些:

-=(自反減賦值)*=(自反乘賦值)/=(自反除賦值)%=(自反模賦值)自反算術(shù)賦值的結(jié)合方向與賦值運(yùn)算符一樣,為自右向左。另外,它的優(yōu)先級(jí)別相當(dāng)?shù)?,與賦值是同一級(jí)別。例如表達(dá)式語(yǔ)句:

c=b*=a+2;相當(dāng)于如下兩個(gè)表達(dá)式語(yǔ)句:

b=b*(a+2);

c=b;3.自加和自減運(yùn)算自反算術(shù)賦值運(yùn)算中有兩種更特殊的情況,即:

i=i+1即i+=1和

i=i–1即i-=1這是兩種極為常用的操作。把i稱為計(jì)數(shù)器,用來(lái)記錄完成某一工作的次數(shù)。C語(yǔ)言為它們專門提供了兩個(gè)更簡(jiǎn)潔的運(yùn)算符:

i++或++i和

i--或--i前一種(i++和i--)稱為后綴形式;后一種(++i和--i)稱為前綴形式,都稱為自加或自減運(yùn)算符。例如:

inti=5;inti=5;

i++;

++i;

y=i;y=i;兩段程序執(zhí)行的結(jié)果i值都為6,y的值也都為6。但是把它們引用在表達(dá)式中就表現(xiàn)出區(qū)別了。例如:

inti=5;

x=i++; /*相當(dāng)于x=i;i=i+1;*/

y=i;的執(zhí)行結(jié)果為:x為5,y為6。即后綴方式是“先引用后增值”。而

inti=5;

x=++i; /*相當(dāng)于x=i=i+1;*/

y=i;

的執(zhí)行結(jié)果為:x為6,y為6。即前綴方式是“先增值后引用”。自加和自減運(yùn)算符的結(jié)合方向是“自右至左”,它的運(yùn)算對(duì)象只能是整型變量而不能是表達(dá)式或常數(shù)。例如:5++或(x+y)++是錯(cuò)誤的。4.正負(fù)號(hào)運(yùn)算符正負(fù)號(hào)運(yùn)算符為+(正號(hào))和-(負(fù)號(hào)),它們是一元運(yùn)算符。例如,-5和+65。它們的優(yōu)先級(jí)別高于*、/運(yùn)算符。例如:

-a*b先使a變符號(hào)再乘以b。其實(shí)正負(fù)號(hào)運(yùn)算相當(dāng)于一次算術(shù)賦值運(yùn)算,例如:

-a 相當(dāng)于a=0–a-a*b 相當(dāng)于(0-a)*b它的結(jié)合方向?yàn)樽杂抑磷?。綜上所述,凡賦值運(yùn)算符及其變種(包括自反算術(shù)賦值運(yùn)算符、自加自減運(yùn)算符和正負(fù)號(hào)運(yùn)算符)的結(jié)合方向都是自右至左的。1.3.6賦值類運(yùn)算符的副作用及限制

在程序設(shè)計(jì)中,效率與易讀性是一對(duì)主要矛盾。人們?yōu)榱颂岣叱绦虻男?,往往要使用技巧把程序?qū)懙帽M可能簡(jiǎn)潔一些。但這樣就降低了程序的可讀性和可理解性??勺x性差的后果是易于隱藏錯(cuò)誤,難于糾正錯(cuò)誤,不易維護(hù),降低了程序的可靠性。鑒于“軟件危機(jī)”的教訓(xùn),現(xiàn)代人們進(jìn)行程序設(shè)計(jì)時(shí)要遵守的基本規(guī)范是:可靠性第一,效率第二。為保證可靠性第一,就要清晰易讀第一。這就要求進(jìn)行程序設(shè)計(jì)時(shí),把程序?qū)懙们逦锥恍?。初學(xué)者從一開始就應(yīng)當(dāng)培養(yǎng)這個(gè)良好的程序設(shè)計(jì)風(fēng)格。

C語(yǔ)言允許在一個(gè)表達(dá)式中使用一個(gè)以上的賦值類運(yùn)算符(包括賦值符,自反算術(shù)賦值符,自加、自減運(yùn)算符等)。這種靈活性在給程序帶來(lái)簡(jiǎn)潔性的同時(shí)也會(huì)引起副作用。這種副作用表現(xiàn)在兩個(gè)方面.1.費(fèi)解、易于誤解——對(duì)人的副作用下面是容易引起誤解的兩個(gè)例子。①c=b*=a+2;容易誤解為b*=a;c=b+2;②x=i+++j;應(yīng)該理解為x=(i++)+j呢?還是x=i+(++j)呢?實(shí)際上C編譯器總是從左至右盡量多地將若干個(gè)字符組成一個(gè)運(yùn)算符(對(duì)標(biāo)識(shí)符也如此),因此i+++j被處理成(i++)+j而不是i+(++j)。

克服這類副作用的方法是:盡量把程序?qū)懙靡锥恍?。為了使表達(dá)式清晰易懂,可以采用這樣一些措施:

(1)將費(fèi)解處分解。例如將上面第①個(gè)表達(dá)式語(yǔ)句分寫為

a=a+2;

b=b*a;

c=b;或c=a+2;

c=b*c;對(duì)第②個(gè)表達(dá)式語(yǔ)句,可分寫為:

x=i+j;

i++;(2)加一些“冗余”括號(hào)為了避免出現(xiàn)差錯(cuò),在易于誤解的地方加一些“冗余”括號(hào)。例如,c=b*=a+2可以改寫為

c=b*=(a+2);或c=(b*=(a+2));便清晰些了。所謂“冗余”括號(hào)是指如果不加這些括號(hào)的話計(jì)算機(jī)也不會(huì)錯(cuò),但為了讓人不致誤解而多加的括號(hào)。

(3)加注釋說(shuō)明。注釋是提高程序清晰性的有力工具。對(duì)C語(yǔ)言來(lái)說(shuō),注釋不會(huì)影響程序的效率。所以,一方面想保證程序的效率,一方面又怕別人誤解(當(dāng)然自己不能誤解)的情況下,可以加注釋說(shuō)明。如對(duì)c=b*=a+2可以寫為:

c=b*=a+2;

/*a=a+2;c=b*c*/2.不定解——對(duì)機(jī)器的副作用先看一個(gè)例子:

j=3;

i=(k=j+1)+(j=5);執(zhí)行這段程序時(shí),不同機(jī)器上得到i的值可能是不同的。有的機(jī)器先執(zhí)行(k=j+1)然后再執(zhí)行(j=5),i值得9。而有的機(jī)器是先執(zhí)行(j=5)后執(zhí)行(k=j+1),i的值就成了11。在數(shù)學(xué)中,a+b和b+a是一樣的,因?yàn)榉辖粨Q律,所以(a+b)+(c+d)也可以寫成(c+d)+(a+b)。換言之,(a+b)+(c+d)的求值順序不影響結(jié)果(可以先求a+b,也可以先求c+d)。但在C表達(dá)式中含有一個(gè)以上的賦值類運(yùn)算符時(shí),交換律不再適用。由于C語(yǔ)言對(duì)表達(dá)式的求值順序(方向)無(wú)統(tǒng)一規(guī)定,而是由各個(gè)C編譯系統(tǒng)自己決定,這就造成了同一程序在不同計(jì)算機(jī)系統(tǒng)運(yùn)行時(shí)會(huì)得到不同的結(jié)果。為了提高程序的可移植性,應(yīng)當(dāng)使表達(dá)式分解,使之在任何機(jī)器上運(yùn)行都能得到同一結(jié)果。因此上面語(yǔ)句可改為:

j=3;

k=j+1;

j=5;

i=k+j;第2章基本數(shù)據(jù)類型

2.1基本數(shù)據(jù)類型的特征2.2數(shù)據(jù)常量2.3數(shù)據(jù)類型轉(zhuǎn)換2.4數(shù)據(jù)的控制臺(tái)輸入與輸出C語(yǔ)言數(shù)據(jù)類型基本數(shù)據(jù)類型導(dǎo)出數(shù)據(jù)類型double(雙精度浮點(diǎn)型)long(長(zhǎng)整型)

char(字符類型)整型short(短整型)int(整型)浮點(diǎn)型float(單精度浮點(diǎn)型)longdouble(長(zhǎng)雙精度浮點(diǎn)型)

void類型用戶定制類型T*(指針類型)struct{…}(結(jié)構(gòu)體類型)union{…}(共用體類型)文件類型enum(枚舉)函數(shù)類型構(gòu)造類型T[…](數(shù)組類型)C語(yǔ)言提供有豐富的數(shù)據(jù)類型:2.1基本數(shù)據(jù)類型的特征

C語(yǔ)言提供的基本數(shù)據(jù)類型包括char(字符)型、int(整)型、float(單精度實(shí))型、double(雙精度實(shí))型。并且還可以通過(guò)使用short、long、signed和unsigned修飾char和int,用long修飾double,形成更多的類型。2.1.1數(shù)值的定點(diǎn)表示與浮點(diǎn)表示

定點(diǎn)表示和浮點(diǎn)表示,是C語(yǔ)言基本數(shù)據(jù)類型的重要特征。為了說(shuō)明什么是“定點(diǎn)”,什么是“浮點(diǎn)”,先看π值的幾種表示形式:日常的表示法C語(yǔ)言中的表示形式 3.14159×100 3.14159e0 0.314159×101

0.314159e+1 0.0314159×102

0.0314159e+2 31.4159×10-1

31.4159e-1 3141.59×10-3

3141.59e-3實(shí)型常量實(shí)型常量有十進(jìn)制的定點(diǎn)和浮點(diǎn)兩種表示方法,但并不存在其他進(jìn)制的表示。

(1)定點(diǎn)表示的實(shí)數(shù)簡(jiǎn)稱定點(diǎn)數(shù),實(shí)際上是以小數(shù)形式表示實(shí)數(shù)。定點(diǎn)表示的實(shí)數(shù)是由一個(gè)正號(hào)或負(fù)號(hào)(正號(hào)可以省略)后接若干個(gè)十進(jìn)制數(shù)字和一個(gè)小數(shù)點(diǎn)所組成,這個(gè)小數(shù)點(diǎn)可以處在任何一個(gè)數(shù)字位的前面或后面。例如,數(shù)字長(zhǎng)度為4,小數(shù)點(diǎn)位于中間,那么可以表示10.28,也可以表示0.01,與這種方法性質(zhì)類似的定點(diǎn)表示還有使用分?jǐn)?shù)的形式。定點(diǎn)數(shù)的固定窗口形式使得他既不能夠表示非常大的數(shù)又并且當(dāng)除法發(fā)生時(shí),大量

的精度丟失.(2)浮點(diǎn)表示的實(shí)數(shù)簡(jiǎn)稱浮點(diǎn)數(shù),實(shí)際上是以指數(shù)形式表示實(shí)數(shù)。浮點(diǎn)表示的實(shí)數(shù)是由一個(gè)十進(jìn)制整數(shù)或定點(diǎn)數(shù)后接一個(gè)字母E(大、小寫均可)和一個(gè)1至3位的十進(jìn)制整數(shù)所組成,字母E之前的部分稱為該浮點(diǎn)數(shù)的尾數(shù),之后的部分成為該浮點(diǎn)數(shù)的指數(shù)或階,該浮點(diǎn)數(shù)的值就是它的尾數(shù)乘以10的指數(shù)冪。對(duì)于一個(gè)浮點(diǎn)數(shù),若將它尾數(shù)中的小數(shù)點(diǎn)調(diào)整到最左邊第一個(gè)非零數(shù)字的后面,如1.234e1,則稱它為規(guī)格化(或標(biāo)準(zhǔn)化)浮點(diǎn)數(shù)。浮點(diǎn)數(shù)可以表示較大精度范圍的一個(gè)實(shí)數(shù)。定點(diǎn)數(shù):小數(shù)點(diǎn)固定。浮點(diǎn)數(shù):小數(shù)點(diǎn)不固定(位置不固定)隨階碼浮動(dòng)。1、定點(diǎn)表示法小數(shù)點(diǎn)固定在數(shù)值部分的最高位之前或最低位之后。例如:

1.101011或1101011.2、浮點(diǎn)表示法3.14159+1數(shù)值部分(尾數(shù))指數(shù)(階碼)N=S*2PS——二進(jìn)制小數(shù),稱 “尾數(shù)”,S≥0P——稱為數(shù)N的階碼,為非負(fù)正數(shù)2——階碼“底”浮點(diǎn)形式存儲(chǔ)2.1.2整數(shù)的有符號(hào)類型與無(wú)符號(hào)類型

內(nèi)存中的數(shù)值是以補(bǔ)碼形式存放的,一個(gè)正數(shù)的補(bǔ)碼就是該數(shù)的二進(jìn)制數(shù)(如10的補(bǔ)碼為0000000000001010)。求一個(gè)負(fù)數(shù)的補(bǔ)碼的方法如下:

如-10的補(bǔ)碼可以這樣求: ①先取該數(shù)的絕對(duì)值; 即先取10

②然后以二進(jìn)制形式表示; 10的二進(jìn)制碼為 0000000000001010

③再對(duì)其取反; 取反得1111111111110101

④然后加1; 加1,得1111111111110110,即-10的16位存儲(chǔ)形式為:1111111111110110。2.1.3類型寬度與取值范圍

C語(yǔ)言對(duì)不同類型的數(shù)據(jù)分配不同寬度的存儲(chǔ)空間,典型的存儲(chǔ)空間寬度有:1個(gè)字節(jié)(8位)、2個(gè)字節(jié)(16位)、4個(gè)字節(jié)(32位)、8個(gè)字節(jié)(64位)和10個(gè)字節(jié)(80位)幾種。顯然,不同的長(zhǎng)度,對(duì)應(yīng)的數(shù)據(jù)的取值范圍是不同的。當(dāng)然,同樣長(zhǎng)度的取值范圍還與有無(wú)符號(hào)、是定點(diǎn)表示(整型)還是浮點(diǎn)表示(實(shí)型)有關(guān)。另外還取決于所用的編譯系統(tǒng)。大多數(shù)編譯系統(tǒng)對(duì)一個(gè)帶符號(hào)整數(shù)的數(shù)值范圍處理為:-2n-1~2n-1-1。其中n為該整數(shù)所占的比特?cái)?shù)。如果一個(gè)整數(shù)所占的比特?cái)?shù)為16,則該想整數(shù)的范圍為-32768~32767。也有一些編譯系統(tǒng)對(duì)一個(gè)帶符號(hào)整數(shù)的數(shù)值范圍處理為:-2n-1-1~2n-1-1。如果一個(gè)整數(shù)所占的比特?cái)?shù)為16,則該想整數(shù)的范圍為-32767~32767。不同長(zhǎng)度整型數(shù)據(jù)的取值范圍數(shù)據(jù)長(zhǎng)度(比特)取值范圍Signed(有符號(hào))Unsigned(無(wú)符號(hào))8-128~1270~25516-32768~327670~6553532-2147483648~21474836470~429496729564-(263)

~263-10~264-1(18446744073709551615)由于內(nèi)存和效率的原因,數(shù)據(jù)的表示總是有限的。比如2/3=0.66666666...計(jì)算機(jī)不可能用無(wú)限位的比特來(lái)表示這個(gè)數(shù)。那么它就只能用有限的數(shù)位來(lái)表示浮點(diǎn)數(shù)。設(shè)用十進(jìn)制表示。

0.XXXXXXX*10^(n)

這里0.XXXXXXX是一個(gè)小于1.0大于等于0.1的小數(shù),而n是一個(gè)整數(shù)。如上所說(shuō),浮點(diǎn)數(shù)分兩個(gè)部分:有效數(shù)位部分和指數(shù)部分。一般來(lái)說(shuō)分配給這兩個(gè)部分的表示數(shù)位都是固定的。比如有8位(10進(jìn)制),把其中7位用來(lái)表示有效數(shù)位,另外一位表示指數(shù)部分。那么上面2/3的例子就是

66666670

其意思是0.666667*10^0。

在實(shí)際的計(jì)算機(jī)中,假設(shè)有32位(2進(jìn)制),拿23位當(dāng)有效數(shù)位,8位當(dāng)指數(shù)部分,1位當(dāng)符號(hào)位。在有效數(shù)位部分,因?yàn)橛?3個(gè)有效數(shù)位,設(shè)十進(jìn)制的有效數(shù)字位為X,則有223=10x,即相當(dāng)于十進(jìn)制的x=23*log10(2)=6.92369位。即約是7位十進(jìn)制有效數(shù)字。而指數(shù)部分有8*log10(2)=2.4082位C語(yǔ)言中不同長(zhǎng)度實(shí)型數(shù)據(jù)的取值范圍和數(shù)字精度寬度(比特)數(shù)據(jù)類型機(jī)內(nèi)表示(位數(shù))取值范圍有效數(shù)字和精度階碼尾數(shù)符號(hào)32float8231|3.4e-38|~3.4e+38|大約7位十進(jìn)制有效數(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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論