C-C++語言與研開發(fā)實(shí)踐_第1頁
C-C++語言與研開發(fā)實(shí)踐_第2頁
C-C++語言與研開發(fā)實(shí)踐_第3頁
C-C++語言與研開發(fā)實(shí)踐_第4頁
已閱讀5頁,還剩292頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C/C++語言與研究開發(fā)實(shí)踐伍曉宇 辛勇編著航空工業(yè)出版社內(nèi)容提要本書的前三部分重點(diǎn)放在C/C++語言本身的掌握和使用上,盡量避免較復(fù)雜的算法,可使讀者順利向面向?qū)ο蠹夹g(shù)及可視化程序設(shè)計技術(shù)進(jìn)行平穩(wěn)的過渡。第四部分作為研究專題,深入分析了C/C++程序與其相應(yīng)匯編代碼之間的關(guān)系,使讀者能從更深層次上理解和掌握C/C++的精髓。作者提出的應(yīng)用C/C++程序自動生成匯編代碼這ー技術(shù)可提高開發(fā)工作的效率和程序的穩(wěn)定性。最后以浮動許可證設(shè)計為題,詳細(xì)討論了TCP/IP網(wǎng)絡(luò)的Socket編程技術(shù)和以Windows操作系統(tǒng)為平臺的網(wǎng)絡(luò)加密系統(tǒng)的設(shè)計技術(shù)。前S近年來,在國內(nèi)各高校的許多專、業(yè),尤其是理工科類專業(yè)廣泛設(shè)置了c語言課程的教學(xué)。這是因?yàn)樵趯?shí)際工作中c語言已不僅為計算機(jī)專業(yè)工作者所使用,而且開始為廣大非計算機(jī)專業(yè)出身的工程技術(shù)人員所喜愛和使用,成為理工科各專業(yè)必備的工具。學(xué)習(xí)c語言已成為廣大計算機(jī)應(yīng)用人員和初學(xué)者的迫切要求。但是,隨著計算機(jī)軟件技術(shù)的發(fā)展,特別是可視化程序設(shè)計技術(shù)的廣泛應(yīng)用,原有的c語言教學(xué)體系已不能適應(yīng)需要,應(yīng)該對其教學(xué)內(nèi)容進(jìn)行修改、調(diào)整和充實(shí),并加入C++和C/C++可視化程序技術(shù)等內(nèi)容。目前,髙等教育改革要求壓縮課堂授課學(xué)時,增加授課學(xué)時以外的動手機(jī)會,使學(xué)生不僅能夠完整全面地掌握C/C++的基本知識,同時能夠初步應(yīng)用這些基本知識嘗試去分析和解決各種實(shí)際工程問題。針對以上問題,本書包括以下幾個部分:第一部分:C程序設(shè)計。C程序設(shè)計部分是全書的基礎(chǔ),作者把介紹的重點(diǎn)放在語言本身的掌握和使用上,盡量避免較復(fù)雜的算法,因?yàn)樗惴ū旧聿粚儆谡Z言學(xué)習(xí)的范疇。該部分幾乎所有的實(shí)例都是短小和簡煉的,カ求在初步掌握基本知識的基礎(chǔ)上,使學(xué)生上機(jī)時能盡快將實(shí)例調(diào)試通過,以增強(qiáng)學(xué)習(xí)的信心和興趣。本書對目前國內(nèi)某些C語言教材的ー些觀點(diǎn)進(jìn)行了修正,例如,在PC機(jī)上關(guān)于short、int型數(shù)據(jù)是否有區(qū)別,egister變量是否能起實(shí)際作用等。另外,對于過去教學(xué)中沒有提及的ー些問題進(jìn)行了探討,如PC機(jī)上指針通常的實(shí)際長度等。本書還指出了Turin)C和VisualC++在處理個別問題上的不同點(diǎn)。第二部分:C++程序設(shè)計。以往我們在C++程序設(shè)計學(xué)習(xí)過程中,往往強(qiáng)調(diào)C++面向?qū)ο蠹夹g(shù)內(nèi)容的一面,而忽略它的非面向?qū)ο蠹夹g(shù)部分。作者認(rèn)為C++非面向?qū)ο蠹夹g(shù)的內(nèi)容是學(xué)習(xí)其面向?qū)ο蠹夹g(shù)內(nèi)容的基礎(chǔ)。對于C++程序設(shè)計學(xué)習(xí)過程中的困難,常常是因?yàn)閷δ承┓敲嫦驅(qū)ο筇匦圆荒茌^好理解造成的。本書強(qiáng)調(diào)C++非面向?qū)ο髢?nèi)容的學(xué)習(xí)和正確理解,例如強(qiáng)調(diào)結(jié)構(gòu)體是類的子集。應(yīng)在正確理解C++結(jié)構(gòu)體的基礎(chǔ)匕順利向類的概念進(jìn)行平穩(wěn)的過渡,這樣可以收到較好的學(xué)習(xí)效果。第三部分:VisualC++可視化程序設(shè)計。可視化程序設(shè)計是近年來非常流行的程序開發(fā)技術(shù),由于它大大提高了設(shè)計效率和程序的穩(wěn)定性,因此得到了廣泛應(yīng)用,但目前在各高校的C/C++語言教學(xué)中,它一般不屬于課堂教學(xué)的范疇,這就造成了課堂學(xué)習(xí)與學(xué)生將來實(shí)際應(yīng)用之間的脫節(jié)。因此,在本書中我們將該部分的基本內(nèi)容加上。可視化程序設(shè)計與傳統(tǒng)的程序設(shè)計在基本概念上有很大的區(qū)別,本部分的冃的在于幫助讀者在學(xué)習(xí)標(biāo)準(zhǔn)的C/C++基本知識的基礎(chǔ)上,完成從傳統(tǒng)設(shè)計技術(shù)向可視化設(shè)計技術(shù)的過渡。第四部分:研究開發(fā)專題。該部分收集了作者近年來在科研工作中的?些研究開發(fā)實(shí)例,經(jīng)過簡化后總結(jié)于本書中,可供科研開發(fā)人員參考,也可作為學(xué)生在完成C/C++的課程學(xué)習(xí)之后,進(jìn)ー步學(xué)習(xí)提高之用。第二十四章“C/C++程序深入剖析”從編譯系統(tǒng)的角度,對C/C++執(zhí)行程序的內(nèi)存映象結(jié)構(gòu)進(jìn)行了分析,并以TurboC和BorlandC++編譯器為實(shí)例深入分析了C/C++程序與其相應(yīng)匯編代碼之間的關(guān)系,使讀者能從更深層次上理解和掌握C/C++語言的精髓。在該章中,作者提出了應(yīng)用C/C++程序自動生成匯編代碼這ー技術(shù)可大大提高開發(fā)工作的效率和程序的穩(wěn)定性。第二十五章“PC機(jī)存儲器型卡程序設(shè)計”充分利用第二十四章的成果,將其應(yīng)用于電路板卡的程序設(shè)計工作中。第二十六章浮動許可證加密系統(tǒng)(FloatingLicense)設(shè)計,以作者為新加坡國立大學(xué)所屬某軟件公司開發(fā)的網(wǎng)絡(luò)浮動加密系統(tǒng)為原型,詳細(xì)討論了TCP/IP網(wǎng)絡(luò)的Socket編程技術(shù),計算機(jī)ID號的構(gòu)造,浮動許可證工作原型和設(shè)計的基本技術(shù)等。讀者在學(xué)習(xí)基本原理的基礎(chǔ)上,可以開發(fā)自己的系統(tǒng)。本書第一、二、四部分由伍曉宇編寫、第三部分由辛勇編寫,全書由伍曉宇統(tǒng)編和修改,由南昌大學(xué)楊國泰教授審稿,作者|?分感謝華中理工大學(xué)同窗學(xué)友李建軍博上為本書所提出的許多建設(shè)性的意見。另外,深圳大學(xué)學(xué)生劉斌、胡勇、馮俊秋、儲昕、奚榮斌和張順娣等在參加作者指導(dǎo)的科研實(shí)踐和畢業(yè)設(shè)計中做了不少與本書有關(guān)的工作,在此向他們表示感謝。由于作者水平有限,肯定會有不少缺點(diǎn)或錯誤,希望得到專家和讀者批評指正。伍曉宇辛勇1999年9月E-mail:wuxy@TOC\o"1-5"\h\z\o"CurrentDocument"第一部分C程序設(shè)計 1\o"CurrentDocument"第一章C語言概述 2\o"CurrentDocument"C語言來源與特點(diǎn) 2\o"CurrentDocument"C語言的結(jié)構(gòu) 3\o"CurrentDocument"第二章常量、變量、運(yùn)算符與表達(dá)式 5\o"CurrentDocument"C語言的基本數(shù)據(jù)類型 5\o"CurrentDocument"常量 7\o"CurrentDocument"變量 9\o"CurrentDocument"各類數(shù)值型數(shù)據(jù)之間的混合運(yùn)算 14\o"CurrentDocument"運(yùn)算符與表達(dá)式 !5\o"CurrentDocument"第三章程序控制語句 21條件分支語句 21\o"CurrentDocument"循環(huán)控制語句 22\o"CurrentDocument"開關(guān)語句與跳轉(zhuǎn)語句 24\o"CurrentDocument"第四章數(shù)組 28\o"CurrentDocument"ー維數(shù)組 28\o"CurrentDocument"二維數(shù)組 30\o"CurrentDocument"字符數(shù)組 31\o"CurrentDocument"第五章指針 33\o"CurrentDocument"定義與引用 33\o"CurrentDocument"ー維數(shù)組與指針的關(guān)系 34\o"CurrentDocument"字符串指針 35\o"CurrentDocument"指針內(nèi)存分配 36\o"CurrentDocument"多維數(shù)組與指針的關(guān)系 38\o"CurrentDocument"指針數(shù)組和指向指針的指針 40\o"CurrentDocument"函數(shù) 43\o"CurrentDocument"函數(shù)的定義 43\o"CurrentDocument"函數(shù)的說明 44\o"CurrentDocument"函數(shù)的調(diào)用 45\o"CurrentDocument"遞歸調(diào)用 49\o"CurrentDocument"命令行參數(shù) 50\o"CurrentDocument"函數(shù)指針 51\o"CurrentDocument"函數(shù)變參 54\o"CurrentDocument"結(jié)構(gòu)體 56\o"CurrentDocument"結(jié)構(gòu)體的定義 56\o"CurrentDocument"結(jié)構(gòu)體的引用 57\o"CurrentDocument"結(jié)構(gòu)體的初始化 58\o"CurrentDocument"指向結(jié)構(gòu)體的指針 59\o"CurrentDocument"共用體(聯(lián)合體) 61\o"CurrentDocument"枚舉類型 63\o"CurrentDocument"自定義類型 64\o"CurrentDocument"位段 66\o"CurrentDocument"編譯預(yù)處理 68\o"CurrentDocument"宏定義 68\o"CurrentDocument"文件包含處理 70\o"CurrentDocument"條件編譯 70\o"CurrentDocument"第九章文件I/O 72\o"CurrentDocument"文件的操作模式 72\o"CurrentDocument"文件與設(shè)備的讀寫 73\o"CurrentDocument"第二部欠C++程序設(shè)計 81\o"CurrentDocument"第十章C++的非面向?qū)ο筇匦裕–的擴(kuò)展) 82\o"CurrentDocument"C++的輸入和輸出 82\o"CurrentDocument"NEW和DELETE 82\o"CurrentDocument"CONST 83\o"CurrentDocument"注解 84\o"CurrentDocument"缺省的函數(shù)形式參數(shù) 84\o"CurrentDocument"強(qiáng)制類型轉(zhuǎn)換 84\o"CurrentDocument"弓|用(REFERENCE) 85\o"CurrentDocument"函數(shù)原型(說明) 87\o"CurrentDocument"結(jié)構(gòu)體(STRUCT)與共用體(UNION) 87\o"CurrentDocument"第十一章類 94\o"CurrentDocument"11.!類與對象(變量) 94\o"CurrentDocument"11.2靜態(tài)成員 100\o"CurrentDocument"第十二章派生類 103

12.1一般派生10312.2虛函數(shù)10912.3虛基類112第十三章友元11413.I友元函數(shù)11413.2友元類114第十四章運(yùn)算符重載11614.1一元運(yùn)算符11614.2二元運(yùn)算符117第十五章流庫12215.1流類的結(jié)構(gòu)12215.2設(shè)備操作符12315.3OSTREAM和!STREAM成員函數(shù)的應(yīng)用12415.4文件管理126第十六章模板13216.1函數(shù)模板13216.2類模板133第三部分VISUALC++可視化程序設(shè)計136第十七章VISUALC++可視化編程的基本思想13717.1MFC編程特點(diǎn)13717.2VC工程文件的構(gòu)成13717.3AppWizard工具13817.4CLASSWIZARD工具13917.5ResourceEditor工具141第十八章MFC程序結(jié)構(gòu)分析14318.1Windows程序工作原理14318.2建立應(yīng)用程序14318.3程序結(jié)構(gòu)剖析14418.4顯示文本14718.5顯示圖形14818.6顯示位圖14918.7文檔的串行化150

TOC\o"1-5"\h\z\o"CurrentDocument"直接顯示數(shù)據(jù) 151\o"CurrentDocument"保持顯示數(shù)據(jù) 151\o"CurrentDocument"第十九章消息處理過程 155\o"CurrentDocument"消息處理機(jī)制 155\o"CurrentDocument"鼠標(biāo)消息 155鍵盤消息 156窗ロ消息 156\o"CurrentDocument"其它消息 158\o"CurrentDocument"自定義消息 160\o"CurrentDocument"第二十章菜單 163\o"CurrentDocument"菜單的處理機(jī)制 163\o"CurrentDocument"菜單項(xiàng)的增加 163\o"CurrentDocument"菜單項(xiàng)的更新控制 165\o"CurrentDocument"第二十一章對話框 167\o"CurrentDocument"生成對話框資源 167\o"CurrentDocument"對話框的數(shù)據(jù)交換 167\o"CurrentDocument"第二十二章常用控鍵 170進(jìn)度條 170\o"CurrentDocument"滑動條 171\o"CurrentDocument"Up-down控制 173\o"CurrentDocument"工具條 174\o"CurrentDocument"狀態(tài)條 175\o"CurrentDocument"部件庫 177ActiveX控件簡介 183\o"CurrentDocument"第二十三章多任務(wù)編程初步 187\o"CurrentDocument"多進(jìn)程的啟動 187\o"CurrentDocument"多線程的啟動 187\o"CurrentDocument"優(yōu)先級的設(shè)定 188\o"CurrentDocument"任務(wù)間通信與同步 190\o"CurrentDocument"第四部分專題應(yīng)用研究 195196196第二十四章C/C++19619624.1C程序?qū)?yīng)匯編代碼分析

C++程序?qū)?yīng)匯編代碼分析C/C++語言輔助匯編程序設(shè)計第二十五章PC機(jī)存儲器型卡程序設(shè)計存儲型卡駐留程序的基本格式測試電路及其寫入程序ROM文件的準(zhǔn)備第二十六章浮動許可證加密系統(tǒng)計算機(jī)1D號的構(gòu)造FloatingLicense核心技術(shù)License狀態(tài)的管理網(wǎng)絡(luò)防火墻與遠(yuǎn)程監(jiān)控208217230230231232235235238255272附錄:ASCII字符代碼274參考文獻(xiàn)278第一部分C程序設(shè)計第一章C語言概述第二章常量、變量、運(yùn)算符與表達(dá)式第三章程序控制語句第四章數(shù)組第五章指針第六章函數(shù)第七章結(jié)構(gòu)體第八章編譯預(yù)處理第九章文件!/〇第一章C語言概述1.1c語言來源與特點(diǎn)ー、來源C語言是UNIX操作系統(tǒng)的主程序設(shè)計語言,最初UNIX是用匯編語言寫的,存在:I)移植性差;2)開發(fā)效率低;3)難讀等問題。因此,人們希望找到ー種既象匯編語言ー樣能對硬件進(jìn)行直接操作,同時又具有高級語言的優(yōu)點(diǎn)(包括可讀性好,移植性強(qiáng)等)。這類語言介于高級語言和低級語言之間,稱為中級語言。C語言是ー種中級語言。它的發(fā)展過程大體如下:1970年貝爾實(shí)驗(yàn)室的K.Thompson設(shè)計了B語言,并用它來改寫UNIX系統(tǒng)。1972年貝爾實(shí)驗(yàn)室的D.M.Rithie針對B語言過于簡單、功能不強(qiáng)和生成的解釋代碼運(yùn)算速度慢的弱點(diǎn),在B語言的基礎(chǔ)上設(shè)計了C語言。1973年兩人合作用C語言重寫了UNIX操作系統(tǒng),原來的UNIX系統(tǒng)是它們1969年用匯編語言合寫的?,F(xiàn)在UNIX系統(tǒng)90%的代碼是C,廣泛用于各種工作站和小型機(jī),如HP、Sun.RISC/6000等,并產(chǎn)生了很多變種,如Aegis、AIX等。70年代后期微型機(jī)迅速發(fā)展,C語言開始移植到非UNIX系統(tǒng)上,已獨(dú)立于UNIX。1983年,美國國家標(biāo)準(zhǔn)協(xié)會制定了C語言標(biāo)準(zhǔn)——ANSICo目前在PC機(jī)上比較流行的C編譯系統(tǒng)有:MSC,VisualC++TurboC2.0,3.0.TurboC++,BorlandC++HighC++WatcomC優(yōu)點(diǎn):.表達(dá)能力強(qiáng),設(shè)計自由度大。既能完成普通高級語言的功能,又能對計算機(jī)硬件進(jìn)行直接訪問,而且能直接對物理地址進(jìn)行操作或進(jìn)行字位級操作,幾乎沒有限制。.代碼緊湊、高效、書寫簡潔。源代碼中,僅有四種基本數(shù)據(jù)類型,32個關(guān)鍵字。目標(biāo)代碼中,執(zhí)行效率僅比匯編程序低10~20%,編譯代碼小。.良好的移植性。缺點(diǎn):安全性差,表現(xiàn)在數(shù)據(jù)和指針沒有屏障;類型轉(zhuǎn)換比較隨便;數(shù)組越界及變量類型一致性不作語法上的嚴(yán)格檢查。但要辯證地看待上述問題,應(yīng)強(qiáng)調(diào)程序員自己去保證程序的正確性。以下是兒種常用計算機(jī)語言的應(yīng)用范圍。Basic——初學(xué)者Fortran 科學(xué)計算Pascal 學(xué)生COBOL——銀行、金融部門C 程序員1.2C語言的結(jié)構(gòu)/*[例1-1]最簡單的c程序之一,求兩整數(shù)和?//*sampl_l.c*/voidmain(){inta,b,c;a=l;b=2;c=a+b;printf(Mc=%d\n'\c);)運(yùn)行結(jié)果:c=3/*[W1-2]從鍵盤輸入兩整數(shù),并且顯示較大者?//*sampl_2.c*/#include<stdio.h>/?頭文件stdio.h,它包含標(biāo)準(zhǔn)輸入輸出庫函數(shù)的等信息的說明?/intmax(intx,inty); /?函數(shù)max()的說明(申明)*//?主函數(shù)定義?/voidmain(){intake;/?H內(nèi)為函數(shù)體,本行為其中變量定義部分,以下為執(zhí)行部分?//?調(diào)用ANSI標(biāo)準(zhǔn)庫函數(shù)scanf,鍵盤輸入變量a、b值?/scanf(M%d,%d'r,&a,&b);c=max(a,b); /?調(diào)用自編函數(shù)max,其中a、b為實(shí)參?/printf("max=%d",c);/*調(diào)用ANSI標(biāo)準(zhǔn)庫函數(shù)printf,顯示變量c的值?/)/?自編函數(shù)max的定義?/intmax(intx,inty)/?函數(shù)說明部分:函數(shù)類型int,函數(shù)名max,函數(shù)形參x,y及其類型?/{intz; /*{}范圍內(nèi)為函數(shù)體,本行為其中的變量定義部分?/

if(x>y)z=x;elsez=y;returnz;if(x>y)z=x;elsez=y;returnz;/?以下為執(zhí)行部分?//?返回函數(shù)值?/運(yùn)行結(jié)果:3,4匕(從鍵盤上輸入兩整數(shù))max=4通過以上例子可以看出:C程序是由函數(shù)構(gòu)成的。至少包含一個主函數(shù)(main函數(shù)),也可以包含ー個main函數(shù)和若干個子函數(shù)。函數(shù)包括兩種:1)庫函數(shù)。它包括ANSI標(biāo)準(zhǔn)函數(shù)和非ANSI標(biāo)準(zhǔn)函數(shù)。為了保證程序的良好移植性,應(yīng)盡可能使用標(biāo)準(zhǔn)函數(shù)。2)自編函數(shù)。它包括ー個main函數(shù)和若個子函數(shù)。ー個函數(shù)的定義由函數(shù)的說明部分和函數(shù)體兩部分組成。1)函數(shù)的說明部分包括函數(shù)類型,函數(shù)名,函數(shù)參數(shù)(形參)名和形式參數(shù)類型等。2)函數(shù)體是函數(shù)說明部分后的大括號{}之間的部分。它一般包括:a)變量定義;b)執(zhí)行部分:c)返冋函數(shù)值。此外,在程序的開頭還常常有自編函數(shù)的(說明)申明,以及說明庫函數(shù)的頭文件等。關(guān)于書寫格式l)main函數(shù)位置任意,但習(xí)慣上放在其它函數(shù)前面。每條語句的最后必須有一個分號。一行內(nèi)可以寫幾個語句,ー個語句也可以分寫在多行上。程序的注釋部分應(yīng)括在Z*/之間,/和*之間不允許留有空格;注釋部分允許岀現(xiàn)在程序中的各個位置上,但在雙引號“‘’內(nèi)無效。C語言標(biāo)識符的大小寫是不同的(或稱大小寫敏感)。

第二章常量、變量、運(yùn)算符與表達(dá)式2.1 C語言的基本數(shù)據(jù)類型c語言的基本類型可以分為:.字符型。它以char表示。表2.1數(shù)據(jù)類型Windowsな小字節(jié)數(shù)位數(shù)取值范圍charCHAR18-128-+127shortSHORT216-32768-+32767intINT432■2147483648?2147483647longLONG432-2147483648—2147483647unsignedcharUCHAR180-256unsignedshortUSHORT216〇~65535unsignedintUINT4320-4294967295unsignedlongULONG432〇~4294967295floatFLOAT432-1.0E38~+1.0E38(8位有效數(shù)字)doubleDOUBLE864-LOE3O8-+LOE3O8(16位有效數(shù)字).整型。它又可分為:短整型,以short或shortint表示;普通整型,以int表示:長整型,以long或longint表示。在PC機(jī)上的DOS操作系統(tǒng)中,一般無int與short型的區(qū)別,兩者是一致的,但對于PC機(jī)上的Windows系統(tǒng),或者其它機(jī)種上的各種操作系統(tǒng),兩者一般是有區(qū)別的。

對于字符型和整型,可以將其存儲單元中全部二進(jìn)位(bit)用作存放數(shù)本身,而不包括符號,構(gòu)成無符號字符型和無符號整型。包括:unsignedcharunsignedshortunsignedintunsignedlong.浮點(diǎn)型(實(shí)型)。它又可分為:單精度型。它以float表示;雙精度型。它以double表示。.無值型(void)。ANSI標(biāo)準(zhǔn)沒有具體規(guī)定以上各類數(shù)據(jù)類型所占內(nèi)存字節(jié)數(shù),各種機(jī)器或操作系統(tǒng)處理h有所不同。表2.1是PC機(jī)上Windows系統(tǒng)(Win3.x,Win95/97/98)下,各種數(shù)據(jù)類型的有關(guān)信息列表。可以用標(biāo)準(zhǔn)庫函數(shù)sizeof計算數(shù)據(jù)類型的長度進(jìn)行驗(yàn)證,參見以下實(shí)例。/*[例2-1]計算各種基本數(shù)據(jù)類型的字節(jié)長度?//*samp2_l.c*/#include<stdio.h>#include<windows.h>voidmain()sizeof(char));sizeof(char));sizeof(short));sizeof(int));sizeof(long));sizeof(float));sizeof(double));/?以下求Windows表示法的數(shù)據(jù)類型長度,若在TurboC等DOS操作系統(tǒng)上的編譯器*/sizeof(CHAR));sizeof(SHORT));sizeof(INT));sizeof(LONG));sizeof(FLOAT));*/sizeof(CHAR));sizeof(SHORT));sizeof(INT));sizeof(LONG));sizeof(FLOAT));printf("SizeofDOUBLE:%d\n\n'\sizeof(DOUBLE));)以上程序應(yīng)用VisualC++編譯后,運(yùn)行可得以下結(jié)果:Sizeofchar:1Sizeofshort:2Sizeofint:4Sizeoflong:4Sizeoffloat:4Sizeofdouble:8SizeofCHAR:1SizeofSHORT:2SizeofINT:4SizeofLONG:4SizeofFLOAT:4SizeofDOUBLE:8上述程序去除后半部分,可直接在TurboC2.0(DOS操作系統(tǒng)平臺)等編譯器中編譯,其運(yùn)行結(jié)果有些差別,int的長度與short的長度都為2個字節(jié)。2.2常量ー、直接常量.整型(int)常量。它包括:1)10進(jìn)制。例如!0,20等。2)16進(jìn)制。例如OxA,0X10等。.長整型(long)常量。它包括:1)10進(jìn)制。例如一281。2)16進(jìn)制。例如0x33d!。表2.2字符形式功能\n換行\(zhòng)t橫向跳格(即跳到下ー個輸出區(qū))\b退格\r回車\a響鈴\\反斜杠字符“ヽ”ヽ’單引號字符ヾ雙引號字符\ddd!到3位8進(jìn)制數(shù)所代表的字符\xhh1到2位16進(jìn)制數(shù)所代表的字符3.浮點(diǎn)常量。它只有10進(jìn)制表達(dá)方式。1)小數(shù)表示法。例如?1.25,0.4522)指數(shù)表示法。例如6E4(60000),3.5E-5(0.000035)注意,上述X、1、e使用時大小寫都可以。4.字符常量例如:'A','a'字符常量可以用字符對應(yīng)的ASCI!碼數(shù)字表示,即兩者是等價的。如'A'等價于0X41,而‘a(chǎn)'等價于0X61。因此語句行:printf(“%c",'A')和printf("%c”,0x41)都將在屏幕上顯示字符A。除以上形式的字符常量外,還有以’‘ヽ”開頭的特殊字符序列,見表2.2。/*[例2-2]應(yīng)用特殊字符編程*//*samp2_2.c*/#include<stdio.h>#include<conio.h>voidmainQ{printf("\t");printf("\b\b\b");printf("\a");printf("\'");printf("\"");printf("\n\n");getch();/*跳格?//?退三格?//?響鈴?//*顯示'*//*顯示"*//?連續(xù)換2行?//?等待用戶按ー鍵(暫停)*//?以下用相應(yīng)的ASCII碼數(shù)字字符完成相同的動作?/printf("%c","09');printf("%c%c%c",\x08',\x08',"08');printf("%c",”07');printf("%c",”27');printf("%c",”22');printf("%c%c",”〇a',”a');getch();/?跳格?//?退三格?//?響鈴*//*顯示’*//?顯示"*//?連續(xù)換2行?//?等待用戶按ー鍵(暫停)*//?以下用相應(yīng)的ASCII碼數(shù)字直接完成相同的動作?/printf("%c",0x09);/*跳格?/printf("%c%c%c",0x08,0x08,0x08);printf(M%cM,0x07);/?退三格?//*響鈴*/printf(,,%c,',0x27);/*顯示’*/printf(,,%cH,0x22);/?顯示"*/printf(',%c%cH,0x0a,Oxa);/?連續(xù)換2行?/getch();)/?等待用戶按一鍵(暫停)*/5.字符串常量“A",“CHINA”對于字符串,編譯系統(tǒng)自動加空字符、0イ乍為字符串結(jié)尾,所以N個字符組成的字符串常量總是分配N+!個字節(jié)的存儲空間。二、符號常量符號常量通過#define進(jìn)行定義,例如:#definePI3.1415926/*[例2-3]*//?程序名:samp2_3.c*/#include<stdio.h>#definePRICE30voidmain(){intnum,total;num=10;total=num*PRICE;printf(,'total=%d,',total);}運(yùn)行結(jié)果:total=300符號常量不同于變量,它的值在其作用域內(nèi)不能賦值,例如:PR1CE=4O是不合法的。習(xí)慣上,符號常量用大寫字符表達(dá)。2.3變量c語言使用的標(biāo)識符包括變量名、符號名、函數(shù)名、數(shù)組名、類型名等。標(biāo)識符只能由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為下劃線或字母。標(biāo)識符大小寫不同,但許多編譯系統(tǒng)有大小寫敏感開關(guān),設(shè)置其為關(guān)閉狀態(tài)后,將不區(qū)分大小寫。C語言的標(biāo)識符可分為以下三類:

.關(guān)鍵字標(biāo)準(zhǔn)C語言共有32個關(guān)鍵字,每個關(guān)鍵字在C程序中都代表著某ー固定含意,且這些關(guān)鍵字都不允許作為用戶標(biāo)識符使用。.預(yù)定義標(biāo)識符這些標(biāo)識符在C語言中都具有特定含意,如C語言提供的庫函數(shù)名和預(yù)編譯處理命令。.用戶標(biāo)識符用戶可以根據(jù)需要對C程序中用到的變量、符號常量、自己定義的函數(shù)進(jìn)行命名,形成用戶標(biāo)識符。以下是變量定義的格式:く存儲類型〉數(shù)據(jù)類型變量<=初值〉;(“0”內(nèi)的項(xiàng)目有時可以省略)例如:staticinta=l;unsignedlongd;intx,y,sum;charch,key;ー、局部變量局部變量是在函數(shù)內(nèi)部定義的變量,它只在本函數(shù)范圍內(nèi)有效。例如:voidmain(){inta,b;}voidfunc();{inta,b;特點(diǎn):1)程序運(yùn)行過程中,局部變量并不始終占有內(nèi)存空間,只有在用到它們之前オ為其分配一定的存儲空間。2)局部變量僅在定義它的函數(shù)內(nèi)部有效,對主函數(shù)main。也不例外,這是和PASCAし不同的。3)在不同函數(shù)中使用相同的局部變量名是允許的,不會互相沖突。例如上面的主函數(shù)main。和子函數(shù)func()都定義了變量a和b,它們在內(nèi)存中實(shí)際占用不同的單元,互不干擾。4)在ー個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也可稱為“分程序”或“程序塊”。例如:voidmain(){inta,b;{intc;/{intc;/?分程序開始*/c=a+b;} /?分程序結(jié)束?/)變量c只在復(fù)合語句(分程序)內(nèi)有效,離開該復(fù)合語句該變量無效,釋放內(nèi)存單元。局部變量的存儲類型有auto(自動)、static(靜態(tài))和代gister(寄存器)三種。.自動變量(auto)當(dāng)局部變量未指明存儲類型時,被自動說明成auto變量,即auto可以省略不寫。自動變量是普通的局部變量。.靜態(tài)局部變量(static)作用域限制于定義它的函數(shù)內(nèi),靜態(tài)局部變量在編繹時就分配了固定的存儲單元,當(dāng)程序運(yùn)行離開所定義的函數(shù)時,靜態(tài)變量的值得到保留,當(dāng)再次進(jìn)入該函數(shù)運(yùn)行時,還可繼續(xù)使用上一次運(yùn)行保留的數(shù)值。/*[例2-4]*//*samp2_4.c*/#include<stdio.h>voidadd();voidmain(){add();add();add();)voidadd(){staticintx=2; /*x為靜態(tài)局部變量?/printf(M%d\nM,x);x=x+2;}運(yùn)行結(jié)果:C>samp2_4/如在上述程序中去掉static,結(jié)果為:TOC\o"1-5"\h\z2 24 26 23.寄存器變量(regisler)為提高執(zhí)行效率,C語言允許將局部變量的值放在運(yùn)算器中的寄存器里,需要時直接從寄存器中取出參加運(yùn)算,不必再到內(nèi)存中去存取,這種變量叫做寄存器變量,用關(guān)鍵詞register作說明。/?例[2?5]*//*samp2_5.c*/#include<stdio.h>voidmain(){registerinti,f=1; /?定義寄存器變量?/for(i=l;i<5;i++){f=f*i;printf(H%dH,f);})寄存器變量只能用做局部變量,它不能太多,因寄存器有限。寄存器變量太多時,編譯系統(tǒng)將其自動轉(zhuǎn)為自動變量。有些C語言教材認(rèn)為PC機(jī)上的C編譯系統(tǒng)中,寄存器變量無作用,這ー說法是錯誤的,有興趣的讀者可以使用第24章的方法進(jìn)行分析。二、全局變量全局變量在函數(shù)外部定義,可為本文件中的各個函數(shù)所共用,它的作用域?yàn)槎x這個變量的位置開始到本源程序文件結(jié)束處。例如:intp=l,q=5;voidfunc(){intb,c;charcl,c2;voidmain(){inta,b,c;)p、q、cl、c2都是全局變量,但它們的作用域不同,在main()中函數(shù)可以使用全局變量p、q、cl、c2,但在func()函數(shù)中只能使用全局變量p、q而不能使用cl、c2。如果在同一個源文件中,全局變量與局部變量同名,則在局部變量的作用域內(nèi),全局變量不起作用。全局變量在程序加載運(yùn)行過程中,始終占用內(nèi)存空間。設(shè)置全局變量的作用是増加函數(shù)間數(shù)據(jù)聯(lián)系的渠道,在ー個函數(shù)中改變?nèi)肿兞康闹?就能影響到其它函數(shù),但全局變量不能過多使用,否則維護(hù)不方便。必要時,可以對全局變量使用extern(外部)和static(靜態(tài))兩種存儲類型。.外部全局變量(extern)如果全局變量在文件開頭定義,則整個該源程序文件范圍內(nèi)都可以使用該全局變量,如果不在文件開頭定義,其作用域只限于定義點(diǎn)到文件終點(diǎn)。如果在定義點(diǎn)之前的函數(shù)想引用該全局變量,則應(yīng)該在該函數(shù)中或者在引用函數(shù)所在源文件的開頭用關(guān)鍵詞extern對該全局變量作“外部引用說明"。參見以下實(shí)例:/*[例2.6]判斷輸入整數(shù)a,b的最大值?//?程序名:samp2_6.c*/#include<stdio.h>intmax(inta,intb);/?函數(shù)max()的說明?/voidmain(){externintz;/?在全局變量z定義域外引用它?/intx,y;scanf("%d:%d”,&x,&y);z=max(x,y);printf("max:%d”,z);}intz; /?定義全局變量z,其作用域從本行到本源程序最后一行?/intmax(inta,intb){if(a>b)returna;elsereturnb;)運(yùn)行結(jié)果:4:5上max:5當(dāng)用多個C源程序共同編譯鏈接生成一個統(tǒng)ー的執(zhí)行文件時,若一個源程序里需要引用另ー個源程序中已經(jīng)定義過的全局變量(兩者是同一個全局變量),則應(yīng)該在引用的函數(shù)中或者在引用函數(shù)所在源文件的開頭用關(guān)鍵詞extern對該全局變量作“外部引用說明”,表示該變量在另一個源程序中定義。參見以下實(shí)例:/*[例2-7]*//?源程序1:samp2_7.c*/#include<stdio.h>inttemp(); /?函數(shù)temp。的說明?/externintz; /*引用另ー個源程序temp.c中的全局變量z*/voidmain(){tempo; /?引用另ー個源程序temp.c中的子函數(shù)tempO*/printf(Hz=%d\n",z);}/?源程序2:temp.c*/intz;inttemp(){z=3;return1;為編譯上述程序,在VisualC++的工程中應(yīng)包括下列源程序名:samp2_7.ctemp.c.靜態(tài)全局變量限制作用域于定義它的源程序中,其它源程序不能引用,即使加上extern也不行。例如,若將[例2-7]中的全局變量z在源程序2中的定義改為靜態(tài)全局變量,即staticintz;則源程序1無法對該變量進(jìn)行引用,因?yàn)閦的作用域僅限于源程序2中。三、變量的初始化變量的初始化就是在定義變量的同時,給變量賦初值。例如:inta=3;相當(dāng)于inta;a=3;也可以連續(xù)定義和初始化幾個變量:inti=3,k=10,a;對于全局變量、靜態(tài)變量,其初始化在整個程序編譯時完成;而對于局部變量,其初始化在所在的函數(shù)執(zhí)行過程中完成。各類數(shù)值型數(shù)據(jù)之間的混合運(yùn)算實(shí)際應(yīng)用中,常存在各種類型數(shù)據(jù)的混合運(yùn)算,例如:10+'a'+l.5-8265.1234*1)'規(guī)則:不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算。轉(zhuǎn)換過程是自動的,規(guī)律如圖2.1所示。double<—floatTunsignedlong—>longtunsignedint—>int<—char,short圖2.1.圖中橫向向左的箭頭表示必定要進(jìn)行的轉(zhuǎn)換,如char,short型數(shù)據(jù)運(yùn)算前必先轉(zhuǎn)換為int型數(shù)據(jù),float型數(shù)據(jù)在運(yùn)算時一律先轉(zhuǎn)換成double型。即使是兩個float型數(shù)據(jù)相加,也先轉(zhuǎn)換成double型然后再相加,以提高運(yùn)算精度。.縱向和橫向向右的箭頭表示運(yùn)算對象為不同類型時的轉(zhuǎn)換方向,注意箭頭方向只表示數(shù)據(jù)類型級別的高低,由低向高轉(zhuǎn)換,而不表示轉(zhuǎn)換的過程。例如:10+'a'+i*fde其中i—int,f—float,d—double,e long分析如下:i*ffdoubled/e—doubleH~int(轉(zhuǎn)換為H的ASCII數(shù)值0x61)因此,最后結(jié)果為double型數(shù)據(jù)。/*[例2-8]數(shù)據(jù)類型轉(zhuǎn)換?//*samp2_8.c*/voidmain(){longk;k=32766*10;}上述十分簡單的程序用TurboC2.0編譯后運(yùn)行結(jié)果不正確!即不等于327660。原因在于,雖然整型(int)數(shù)據(jù)32766、10和定義的長整型(long)變量k均沒有越界溢出,但是32766*10=327660結(jié)果在其賦值于k之前仍然應(yīng)該是整型(int)數(shù)據(jù),顯然超出了TurboC2.0編譯系統(tǒng)整型數(shù)據(jù)的范圍。程序中的求值部分,應(yīng)修改為k=32766*101或者k=327661*101。另一方面,上述程序在VisualC++上運(yùn)行正確,為什么?在C語言中可以使用強(qiáng)制類型轉(zhuǎn)換以強(qiáng)迫表達(dá)式的值轉(zhuǎn)換為某ー特定類型,其一般形式是:(類型)表達(dá)式其中類型(type)是ー個單冃運(yùn)算符。例如為確保表達(dá)式x/2成為double型,可以寫成如下形式:(double)x/2運(yùn)算符與表達(dá)式ー、算術(shù)表達(dá)式+(加),-(減),*(乘),/(除)。例如:a+b,2+3,x*y和a/b。%為取模運(yùn)算符。它取得整數(shù)除法后的余數(shù),不能用于float和double型數(shù)據(jù)。例如:5%2,運(yùn)算結(jié)果為1。++,ー使變量完成增1或減1的功能++x,-y —?相同點(diǎn):都使x加1,y減1。x++,y- -1不同點(diǎn):++x,--y是先加1或減1,再使用x,y的值。x++,yー是先使用x,y的值,再加1或減1?例如:若i=3l)j=++i; 〃i先變?yōu)?,然后j的值變?yōu)?。2)j=i++; //j先變?yōu)?,然后i的值變?yōu)?。printf("%d",++i);〃i先變?yōu)?,然后在文本屏幕輸出4,。printf("%d",i++); //在文本屏幕輸出3,然后i的值變?yōu)?。注意:++,ー只能用于變量,而不能用于常量和表達(dá)式。例如5++或(a+b)++是不合法的。在表達(dá)式中包含++,ー運(yùn)算時,很容易出錯。例如,若i=3,則(i++)+(i-H-)+(i-H-)ホ3+4+5=12 錯誤!=3+3+3=9.然后i變?yōu)?。正確!(++i)+(++i)+(++i)#4+5+6=15 錯誤!=6+6+6=18, i先變?yōu)?。 正確!但VisualC++的結(jié)果不同。i+++j等價于(i++)+j。C編譯系統(tǒng)在處理時盡可能多地自左而右將若干字符組成一個運(yùn)算符。printf("%d,%d,%d,%d,%d\n",i,i,++i,i++,++i);在C語言編譯系統(tǒng)中對函數(shù)參數(shù)的求值順序是從右向左(與Pascal語言相反),每處理一個參數(shù)的計算就立即將結(jié)果傳入函數(shù)體內(nèi)部,上述語句的處理過程如下:++i (i=4輸入傳入printf()內(nèi)部,屏幕上顯示4)i++ (i=4輸入傳入printf()內(nèi)部,然后i=5。屏幕上顯示4,)++i (i=6輸入傳入printf()內(nèi)部,屏幕上顯示6)i(i=6輸入傳入printf()內(nèi)部,屏幕上顯示6)i(i=6輸入傳入printf()內(nèi)部,屏幕上顯示6)所以上述表達(dá)式最終輸出結(jié)果應(yīng)為66644:但是也有個別系統(tǒng)的輸出有所不同,例如VisualC++〇在復(fù)合表達(dá)式或更合語句中++,ー運(yùn)算符均以子表達(dá)式或子句為判斷操作順序的對象,但對于下面將要介紹的復(fù)合型賦值表達(dá)式例外,例如:inta,b,i=5,c;a=(b=5+i++); /?在復(fù)合型賦值表達(dá)式中,先a=b=10,然后i=6*/if(++a==b++) /?先a=ll,再判斷a是否等于b(顯然條件不滿足),最后b=ll*/c=b++;elsec=++a; /?先a=12,然后c=12*/二、賦值表達(dá)式例如:a=3;b=(a+3)*c;若有連續(xù)多個賦值表達(dá)式,它們之間也可以用逗號相連,但最后仍必須用分號結(jié)束,例如,上述兩個賦值語句可改寫為:a=3,b=(a+3)*c;

賦值號’=’左邊只能是變量,所以3+m=6是不合法的。賦值運(yùn)算符兩側(cè)的運(yùn)算對象的數(shù)據(jù)類型不同時,系統(tǒng)自動進(jìn)行類型轉(zhuǎn)換,即charfintlong―floatdouble上述右邊類型的數(shù)據(jù)賦給比較靠左邊類型的變量時,可能會發(fā)生截斷現(xiàn)象,例如,浮點(diǎn)數(shù)賦給ー個整型變量時,小數(shù)點(diǎn)后面的部分將被舍去(不進(jìn)行四舍五入運(yùn)算)。在C語言中大量使用復(fù)合型賦值表達(dá)式,它體現(xiàn)了C語言表達(dá)的靈活性。例如:b=(b=(a=3*5,a*4);c=(a=3*5,b=a*4,a);結(jié)果:a=15,b=60結(jié)果:a=15,b=60,c=15a+=3;等價于a=a+3;x*=y+8;等價于x=x*(y+8);x%=3;等價于x=x%3;a=(b=5);等價于a=b=5;a=b=c=5;a=(b=4)+(c=6);等價于b=4;c=6;a=b+c;結(jié)果:a=10a=(b=10)/(c=2);等價于b=10;c=2;a=b/c; 結(jié)果:a=5c=(a=2)+(a=5);等價于a=2;a=5;c=a+ai結(jié)果:a=10a=12;a+=a-=a*a;等價于a=12;a-=a*a;a+=a;結(jié)果:a=-264三、逗號表達(dá)式逗號表達(dá)式的值等于其中最后ー項(xiàng)表達(dá)式的位。例如,如果a=l,b=2,c=3,則printf("%d,%d,%d",(a,b,c),b,c);將在文本屏幕上輸出:3,2,3四、關(guān)系、邏輯表達(dá)式>大于<小于>=大于等于<=小于等于=等于!=不等于z=(x==y?10:5);上式含義:當(dāng)x=y時,z=10:否則片5。故相當(dāng)于語句:if(x=y)thenz=10;elsez=5;或者相當(dāng)于語句:if(x!=y)thenz=5;elsez=10;&&邏輯與I!邏輯或!邏輯非例如:if((a>b)&&(i<l))z=10;上式含義:當(dāng)a大于b并且i<l時,令z=10。又例如:if((a=l)ll(b>0))z=10;上式含義:當(dāng)a等于1或者b大于0時,令z=10。又例如:if(!(x>y))z=10;上式含義:當(dāng)x大于y不成立(也就是y大于或等于x)時,令z=10。五、求類型長度運(yùn)算符sizeofsizeof用于計算ー種數(shù)據(jù)類型所占的字節(jié)數(shù),例如:sizeof(double)o參見[例2-1]。六、按位運(yùn)算符只能用于計算字符型和整型(char、short、int和long)數(shù)據(jù)。&按位與:運(yùn)算符&對于參加運(yùn)算的兩個運(yùn)算數(shù)進(jìn)行按位與運(yùn)算,如果兩個相應(yīng)的位都為!,則該位的運(yùn)算結(jié)果為!,否則為〇。注意,不可把&運(yùn)算符和邏輯與&&運(yùn)算符混淆。對于&&運(yùn)算符,只要兩邊運(yùn)算數(shù)為非。,運(yùn)算結(jié)果為1;而對于按位與運(yùn)算結(jié)果并非如此。!按位或:運(yùn)算符I對于參加運(yùn)算的兩個運(yùn)算數(shù)進(jìn)行按位或運(yùn)算,即,只要兩個相應(yīng)的位中有一個為1,則該位的運(yùn)算結(jié)果為1:只有當(dāng)兩個相應(yīng)的位都為。時,該位運(yùn)算結(jié)果オ為〇。例如,如果想使short型變量a的低字節(jié)全置1,高字節(jié)保持原樣,可采用表達(dá)式a=al0xffo如果想使a的高字節(jié)全置1,低字節(jié)保持原樣,可采用表達(dá)式a=aK)xfQ。。人按位異或:如果參加運(yùn)算的兩個運(yùn)算數(shù),相應(yīng)位上的數(shù)相同,則該位的運(yùn)算結(jié)果為。;不同,則運(yùn)算結(jié)果為1。?按位取反:它是單目運(yùn)算符,運(yùn)算對象出現(xiàn)在運(yùn)算符的右邊,其運(yùn)算功能是把對象的內(nèi)容按位取反。注意,?x不是求x的負(fù)數(shù)。例如,?1的運(yùn)算結(jié)果不是-1而是ー2,?8的運(yùn)算結(jié)果是ー9,學(xué)習(xí)過補(bǔ)碼知識的讀者很容易理解這ー問題。<<按位左移:運(yùn)算對象出現(xiàn)在運(yùn)算符的左邊,右邊是整型表達(dá)式,表示左移的位數(shù),左移時,低位(右邊)補(bǔ)。。?按位右移:運(yùn)算對象出現(xiàn)在運(yùn)算符的左邊,右邊是整型表達(dá)式,表示右移的位數(shù),右移時,對于正數(shù),高位(左邊)補(bǔ)。;對于負(fù)數(shù),高位(左邊)補(bǔ)1。/*[例2-9]*//*samp2_9.c*/#include<stdio.h>

voidmain(){unsignedchara;/*&按位與*/a=0x41&OxCO;/?相當(dāng)于二進(jìn)制01000001*/printf("0x41&0xC0=%x\n'\a); /* AND11000000*//* OKXXXXX)=0x40*//*!按位或*/a=0x41IOxCO;printf(**0x4110xC0=%x\n",a);/?相當(dāng)于二進(jìn)制01000001*//* OR11000000*//* 11000001=0xCl*//*A按位異或?/a=0x41AOxCO;printf("0x41A0xC0=%x\n",a)/?相當(dāng)于二進(jìn)制01000001*/; /* XOR110CXXXX)*//* 10000001=0x81*//*A按位異或*/a=0x81AoxCO;printf("0x81A0xC0%x\n",a);/?相當(dāng)于二進(jìn)制10000(X)1*//* XOR11000000*//* 01000001=0x41*//??按位取反?/a=?0x41;printf("-0x41=%x\n'\a);/?相當(dāng)于二進(jìn)制 ?//* NOT01000001*//* 10111110=0xBE*//*?按位右移?/a=a?2;printf("0xBE?2=%x\n",a);/*10111110右移2位為00101Hl=0x2F*//*?按位左移?/a=a?2;printf("0x2F?2=%x\n",a);/*00101111左移2位為1011ll00=0xBC*//?對有符號整型數(shù)按位取反。伴1=00000001按位取反為11111110=-2*/8=(XXX)1(XX)按位取反為11110111=-9*/printf(M%d,%d\n",-1,-8);}運(yùn)行結(jié)果:0x41&0xC0=400x41IOxCO=cl0x41A0xC0=810x81A0xC041~0x41=be0xBE?2=2f0x2F?2=bc-2,-9七、運(yùn)算符優(yōu)先級表2.3列出了C語言運(yùn)算符的優(yōu)先次序。注意,所有的運(yùn)算符,除單目運(yùn)算符和“?”以外,都是從左至右關(guān)聯(lián)的。而單目運(yùn)算符“*"、“&"、和“?”是從右向左關(guān)聯(lián)的。另外,從表中可以看出圓括號的運(yùn)算級別是最高的,它的用處是提高它所包含運(yùn)算符的優(yōu)先級別。表2.3 C語言運(yùn)算符的優(yōu)先次序最高()[]->.!~++—(type)*&sizeof*/%+-??<<=>>===!=&A1&&II9=+=-+*=/=最低第三章程序控制語句C語言中的語句共分為五類,它們是:表達(dá)式語句、函數(shù)調(diào)用語句、空語句、復(fù)合語句和控制語句。.表達(dá)式語句最典型的表達(dá)式語句是由一個賦值表達(dá)式加一個分號構(gòu)成的賦值語句,即:變量=表達(dá)式;.函數(shù)調(diào)用語句函數(shù)調(diào)用語句的一般形式為:函數(shù)名(實(shí)參數(shù));.空語句空語句的一般形式為:.復(fù)合語句更合語句的?般形式為:語句!;語句2; ; }即用花括弧什把若干條語句括起來構(gòu)成一條復(fù)合語句。上述四種語句形式都比較簡單,可以通過各種實(shí)例進(jìn)行學(xué)習(xí),因此下面重點(diǎn)討論控制語句的使用??刂普Z句有可分為條件分支語句、循環(huán)控制語句、開關(guān)語句和跳轉(zhuǎn)語句等。3.1條件分支語句格式:if(表達(dá)式1) 語句1elseif(表達(dá)式2) 語句2elseif(表達(dá)式3) 語句3else 語句n/*[W3-1]根據(jù)從鍵盤輸入的整數(shù)a,b的值,計算a+b,a?b,a*b及aA>*//*samp3_l.c*/#include<stdio.h>voidmain(){inta,b,c;

printf("a=");scanf("%d",&a);printf("b=");scanf("%d",&b);printf( );c=getch();if(c='+')printf("a+b=%d\n",a+b);elseif(c=)printf("a-b=%d\n",a-b);elseif(c='*')printf("a*b=%d\n",a*b);elseif(c=T)printf("a/b=%d\n",a/b);elseprintf("error!\n");)/?從鍵盤輸入整型數(shù)a*///?從鍵盤輸入整型數(shù)a*//?從鍵盤輸入整形數(shù)b*//?從鍵盤輸入運(yùn)算符?//?計算a+b,并顯示結(jié)果?//?計算a-b,并顯示結(jié)果?//*計算a*b,并顯示結(jié)果?//?計算a/b,并顯示結(jié)果?//?其它情況,報錯?/ー、for語句其中:表達(dá)式1:表達(dá)式2:表達(dá)式3:格式:for其中:表達(dá)式1:表達(dá)式2:表達(dá)式3:控制條件,條件表達(dá)式,其值為TRUE(非〇值)和FALSE(0值)兩種。增量,賦值表達(dá)式。它的執(zhí)行步驟如下:.計算表達(dá)式1。.計算表達(dá)式2,若值為非0,執(zhí)行3);若值為〇,執(zhí)行6)。.執(zhí)行循環(huán)體語句。.計算表達(dá)式3。.轉(zhuǎn)向2)執(zhí)行。.結(jié)束循環(huán),執(zhí)行for循環(huán)后的語句。/*例[3-2]用ASCI!碼數(shù)值顯示A到Z的26個字母?//*samp3_2.c*/#include<stdio.h>voidmain(){chari;for(i=65;i<=90;i++)/?以A到Z字母的ASCI!碼進(jìn)行循環(huán)?/printf("%c",i);/?顯示大寫字母,如果將%c改變?yōu)椋將顯示數(shù)字?/)for語句還可同時對多個變量進(jìn)行操作,參見以下實(shí)例。/*例[3-3]顯示A到Z等26個字母和它們相應(yīng)的ASCII碼數(shù)值以及順序號*//*samp3_3.c*/

#include<stdio.h>voidmain(){chari,j;for(j=lj=65;i<=90;j-H-,i++)printf(H%d:%d%c\n”J,i,i);}在for語句中,除分號不能省略外,任何一個表達(dá)式都可省略。/?例[34]計算1,23…100之和?//*samp3_4.c*/#include<stdio.h>voidmain(){inti=l,j=0;for(;i<=100;){j+=i;

i++;/*相當(dāng)于{j+=i;

i++;/?循環(huán)變量加1*/)printf("%d",j); /*顯示!-100之和?/}特別地,用for(;;)可以表示無限循環(huán)。二、while語句一前置條件循環(huán)語句格式:while(條件表達(dá)式)循環(huán)體while語句執(zhí)行時,首先對測試條件進(jìn)行檢查,若循環(huán)條件不具備,它可以一次循環(huán)都不進(jìn)行,這是就是所謂前置條件循環(huán)語句。前述的for語句也是前置條件循環(huán)語句的一種。/?例[3-5]不斷要求從鍵盤輸入字符并回顯,直到鍵入字符'.'*//*samp3_5.c*/#include<stdio.h>voidmain(){charc=W;/?賦c的初值?/whUe(c!=.')c=getche();/?讀入字符ジ后,オ退出循環(huán)?/與for(;;)語句相似,while(l)也是ー種無限循環(huán)表達(dá),其中1可以用其它非零常量代替。三、do...while語句 后置條件循環(huán)語句格式:do循環(huán)體while(條件表達(dá)式)首先執(zhí)行循環(huán)體操作,然后再進(jìn)行循環(huán)控制條件判斷,所以它至少執(zhí)行一次循環(huán)體。/?例[3?6]計算10!*//*samp3_6.c*/#include<stdio.h>voidmain(){inta=l;longb=l;do{b*=a; /*相當(dāng)于b=b*a;*/a++;}while(a<=10); /*若av=10,繼續(xù)循環(huán)*/printf(,,10!=%ld\n,\b);/?顯示長整型數(shù)結(jié)果b*/3.3開關(guān)語句與跳轉(zhuǎn)語句ー、switch(開關(guān))語句格式:switch(表達(dá)式){case判斷值1:語句組1;break;case判斷值2:語句組2;break;default:語句組;break;}/*[例3?7]分別計算數(shù)字、空白符和其它字符的數(shù)目?//*samp3_7.c*/#include<stdio.h>voidmain(){intc,i,nwhite,nother,ndigit[10];/?清保存〇到9共10種數(shù)字的數(shù)組元素為0*/for(i=0;i<10;i++)ndigit[i]=0;/?分別淸保存空白字符和其它字符的變量nwhite和nother為0?/nwhite=nother=0;while((c=getchar())!=*\n*){switch(c){case*0*:caseT:case2:case*3*:case'41:case*5*:case*6*:case*9*:ndigit[c--01++;/?數(shù)字字符計數(shù)加1*/break;case'casenwhite++;/?空白字符計數(shù)加1*/break;default:nother++;/*其它字符計數(shù)加1*/break;}}printf("digits=n);for(i=0;i<10;i++)printf(H%d'\ndigit(i]);printf(n,whitespace=%d,other=%d\nH,nwhite,nother);}運(yùn)行結(jié)果:183758275jkaqitl23上digits=0222020220,whitespace=3,other=6二、goto(無條件轉(zhuǎn)移)語句程序設(shè)計方法學(xué)認(rèn)為程序中的got。語句是ー種有害的結(jié)構(gòu),應(yīng)盡可能少用,ー個使用goto語句較為合理的方法是從多層循環(huán)中退出,如for(…)]for(...){while(...){if(...)gotostop;/?當(dāng)條件具備時,跳到stop處執(zhí)行?/stop:/*stop為跳轉(zhuǎn)位置標(biāo)號?/printf(Herrorinprogram!\n°);注意:.跳轉(zhuǎn)位置標(biāo)號可以和變量相同,但與函數(shù)名不能重復(fù),但某些系統(tǒng)無這ー限制。.goto語句的目的地只能在同一函數(shù)內(nèi),也就是goto語句的使用范圍局限于某ー函數(shù)內(nèi)。.不允許從循環(huán)的外部跳轉(zhuǎn)到循環(huán)語句的內(nèi)部。三、break(中斷)語句/?例3?8計算1,2,3,…100之和*//*samp3_8.c*/#include<stdio.h>voidmain(){intij=0;fbr(i=l;;i-H-){if(i>l()0)break;/?當(dāng)i大于1(X)時退出循環(huán)?/j+=i; /*j=j+i*/)printf("%d”,j); /?顯示結(jié)果j*/)運(yùn)行結(jié)果:5050四、continue(繼續(xù))語句跳過continue下面的語句,強(qiáng)行執(zhí)行下一次循環(huán)./?例3?9顯示鍵入字符的下ー個字符(如鍵入A,則顯示B),當(dāng)鍵入$時退出.*//*samp3__9.c*/#include<stdio.h>voidmain(){chardone,ch;done=0; /?賦done的初值?/while(!done){ /?當(dāng)done=0(偽)時,繼續(xù)循環(huán)*/ch=getch();if(ch=r$'){done=l; /?令done=l(真)*/continue; /?強(qiáng)行執(zhí)行下一次循環(huán)?/}putchar(ch4-l);/?顯示字符ch的下ー個字符?/五、return(返回)語句函數(shù)經(jīng)常要通過relurn語句返回到它的調(diào)用處,并將函數(shù)值傳回給調(diào)用它的程序,參見[例1?1]中的max函數(shù),max函數(shù)的運(yùn)行結(jié)果z值正是通過return語句返回給主函數(shù)中的變量Co如果ー個不返回任何位的return語句處在函數(shù)的最低位置,則return本身也可.省略。本章中的實(shí)例基本上是屬于這種情況。第四章數(shù)組數(shù)組是有序數(shù)據(jù)的集合,它的每ー個元素都屬于同種數(shù)據(jù)類型。用ー個統(tǒng)ー啲數(shù)組名和下標(biāo)來唯一地確定數(shù)組中的元素。ー維數(shù)組ー、定義定義格式:類型說明符數(shù)組名[常量表達(dá)式];例如:其中數(shù)組名為a,有a[0]?a[9]10個int型元素。又例如:staticdoubles[1()|;其中數(shù)組名為s?有s[0]~s[9]10個靜態(tài)double型元素。數(shù)組大小用常量表達(dá)式定義,不能包含變量,即不能動態(tài)定義。例如:intn;n=10;inta[n];...是錯誤的!二、引用數(shù)組必須先定義,然后使用。C語言規(guī)定只能逐個引用數(shù)組元素而不能一次引用整個數(shù)組元素。/*[例4?1]ー維數(shù)組元素的引用。素/*samp4_l.c*1#include<stdio.h>voidmain(){inti,a[10]; /?定義整型變量i和數(shù)組a*/for(i=0;i<=9;i++)a[i]=i; /?使a[〇]?a[9]的值為0-9*/for(i=9;i>=0;i-)printf("%d",a[i]);/*逆序輸出數(shù)組元素之值?/)運(yùn)行結(jié)果:987654321〇三、初始化可以用賦值語句或輸入語句使數(shù)組中的元素得到值,但占用運(yùn)行時間。而所謂數(shù)組的初始化是使數(shù)組在編譯階段得到初值。標(biāo)準(zhǔn)C語言規(guī)定只有靜態(tài)變量和全局變量的數(shù)組才能初始化。例如:staticinta[l1]={0,1,2,3,4,5,6,7,8,9,10);注意:.可以只給一部分元素賦值,如staticinta[10]={0,l,2,3};給出前4個元素的值,后6個元素值為〇〇.如不進(jìn)行初始化,系統(tǒng)會對所有元素賦以〇值,但也有些系統(tǒng)是賦隨機(jī)數(shù)。.在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度,而由編譯系統(tǒng)自動確定。例如:staticinta[]={0,l,2,3,4,5,6,7,8,9,10);/?顯示數(shù)組長度為11*/.很多C編譯系統(tǒng),如TurboC、BolandC++、VisualC++等,在初始化數(shù)組時,可以省略static〇.在函數(shù)內(nèi)部的局部數(shù)組變量,也可以采用上述初始化寫法,但其數(shù)組元素值實(shí)際上是在運(yùn)行階段得到的。/*例[4-2]用數(shù)組來處理Fibonacci數(shù)列問題Fibonacci數(shù)列:1,1,2,3,5,8,...即Fl=l (n=l)F2=l (n=2)Fn=Fn-l+Fn-2 (n>=3)打印該數(shù)列的前20個數(shù)./*samp4_2.c*/#include<stdio.h>voidmain(){inti;staticintf[20]={1,1};for(i=2;i<20;i-H-)f[i]=f[i-2]+f[i-l];for(i=0;iv20;i++){if(i%5=0)printf("\n");/*每行輸出5個數(shù)據(jù)后換行?/printf(u%12dn,f[i]);運(yùn)行結(jié)果:11235813213455891442333776109871597258441816765二維數(shù)組ー、定義格式:類型說明符數(shù)組名【常量表達(dá)式][常量表達(dá)式];例如:floata[3][4];定義a為3x4(3行4歹())的單精度實(shí)型數(shù)組??梢园補(bǔ)視為ー個ー維數(shù)組,它有3個元素:a[0],a[l]和a[2],每個元素又是ー個包含4個元素的ー組數(shù)組。即:a[0]:a[0][0]a|0][l}a[0][2]a|0][3]a[U:a[l][0]a[l][l]a[l][2]a[l][3]a[2]:a[2][0]a[2][l]a[2

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論