C_語言PPT譚浩強(qiáng)教材配套版第16章.ppt_第1頁
C_語言PPT譚浩強(qiáng)教材配套版第16章.ppt_第2頁
C_語言PPT譚浩強(qiáng)教材配套版第16章.ppt_第3頁
C_語言PPT譚浩強(qiáng)教材配套版第16章.ppt_第4頁
C_語言PPT譚浩強(qiáng)教材配套版第16章.ppt_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第16章常見錯(cuò)誤和節(jié)目調(diào)試,16.1常見錯(cuò)誤分析16.2節(jié)目調(diào)試,正確學(xué)習(xí)C,寫好C不容易?!办`活性”當(dāng)然是好事,但很難理解。尤其是新手犯了錯(cuò)誤,也不知道是怎么回事。c編譯器對(duì)語法的檢查不如其他高級(jí)語言嚴(yán)格(為了給程序員留下“靈活性”的馀地)。因此,程序員必須自行努力,以確保程序的正確性。(威廉莎士比亞、程序員、程序員、程序員、程序員、程序員和程序員)調(diào)試C程序比調(diào)試PASCAL或FORTRAN程序更困難。必須不斷積累經(jīng)驗(yàn),提高節(jié)目設(shè)計(jì)和調(diào)試節(jié)目水平。C語言有些語法規(guī)定與其他高級(jí)語言不同,學(xué)習(xí)其他高級(jí)語言的讀者根據(jù)使用其他高級(jí)語言的習(xí)慣編寫C程序,這也是錯(cuò)誤的原因之一。16.1在一般錯(cuò)誤分析下

2、,列舉初學(xué)者學(xué)習(xí)和使用C語言(C除外)時(shí)容易犯的錯(cuò)誤,起到提醒作用。牙齒內(nèi)容在以前各章中大部分已經(jīng)提到,為了便于閱覽,集中列在牙齒章節(jié)中,供初學(xué)者參考。(1)變量定義忘了。例如:主要()x=3;y=6;Printf(%dn,x y);C必須為程序中使用的每個(gè)變量定義相應(yīng)的類型。上述程序沒有定義X,Y。必須在函數(shù)正文的開頭添加intx,y。這是學(xué)過BASIC和FORTRAN語言的讀者寫C程序時(shí)常見的錯(cuò)誤。在默認(rèn)語言中,可以直接使用變量類型,而無需先定義變量類型。FORTRAN要求未定義類型的變量根據(jù)隱式I-N規(guī)則確定類型,而c語言要求在牙齒函數(shù)中定義在中使用的所有變量(如果未定義為外部變量)。(

3、2)導(dǎo)入的輸出數(shù)據(jù)的類型與使用的格式說明符不匹配。例如,如果將a定義為整數(shù),將b定義為實(shí)體。a=3;B=45Printf(%f%dn,a,b);編譯時(shí)不提供錯(cuò)誤消息,但運(yùn)行結(jié)果與原始意圖不一致。輸出為000000016402。這不會(huì)根據(jù)分配規(guī)則轉(zhuǎn)換(例如,將45轉(zhuǎn)換為4)。相反,根據(jù)格式文字的要求配置存儲(chǔ)單元的數(shù)據(jù)格式(例如,B表示4字節(jié),最后2字節(jié)的數(shù)據(jù)輸出為%d的整數(shù))(3)沒有注意int數(shù)據(jù)的數(shù)值范圍。通用微機(jī)上使用的C編譯系統(tǒng)為整數(shù)數(shù)據(jù)分配兩個(gè)字節(jié)。因此,整數(shù)范圍為-215215-1,即-3276832767。通常有int num等程序。Num=89101Printf(%d,num);

4、因?yàn)槌^了89101牙齒32767,所以得到了23565。如果兩個(gè)字節(jié)不能容納89101,就會(huì)截去高位。請(qǐng)參閱圖16.1。很快就會(huì)超過低16位數(shù)。想從89101減去216(即由16位二進(jìn)制數(shù)形成的模式)。89101-65536=23565。圖16.1中有時(shí)出現(xiàn)負(fù)數(shù)。例如,num=196607-1輸出。19607的二進(jìn)制格式從00 00 00 00 00 00 00 10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

5、1111111111111111111111111111111111111對(duì)于超出整個(gè)范圍的數(shù)量,請(qǐng)更改為long類型,即long intnum。Num=89101,printf(%ld,num);如果將Num定義為long類型,并且輸出時(shí)仍使用“%d”說明符,則會(huì)發(fā)生以上錯(cuò)誤。(4)輸入變量時(shí)忘記使用地址字符。示例:scanf(%d%d,a,b);這是很多初學(xué)者第一次學(xué)C語言時(shí)常見的疏忽或習(xí)慣性的錯(cuò)誤。因?yàn)槠渌Z言只需要寫變量名,C語言要求“把值發(fā)送到哪個(gè)地址標(biāo)識(shí)的單位”。Scanf(%d%d,(5)輸入時(shí),數(shù)據(jù)的組織與要求不匹配。使用Scanf函數(shù)輸入數(shù)據(jù)時(shí),請(qǐng)注意輸入、組織數(shù)據(jù)的方式。如

6、果有Scanf函數(shù),如Scanf(%d%d),則必須在scanf函數(shù)的格式字符串中輸入除格式說明符以外的其他字符。因此,必須輸入以下內(nèi)容:3,4這個(gè)時(shí)候用“34”反而錯(cuò)了。還要注意,如果scanf(input a,scanf(%d,%d,0),則渡邊杏嘗試false。如果a的值為3,b的值為4,ab,則“AE q u a lt ob”不能按原始意圖輸出?,F(xiàn)在,首先B的值為A,A也為4,賦值表達(dá)式的值為4。If語句中的表達(dá)式值為真(不是0牙齒),因此將輸出“AE q u a lt o b”。這種錯(cuò)誤在編譯時(shí)不能檢查,但執(zhí)行結(jié)果往往是錯(cuò)誤的。而且,由于習(xí)慣的影響,程序員自己也不易察覺。(7)門后缺

7、少分號(hào)。c語言規(guī)定語句末尾必須有分號(hào)。分號(hào)是c語句的組成部分。這也和其他語言不同。有些初學(xué)者往往忘記寫牙齒分號(hào)。例如:在編譯a=3 b=4時(shí),如果編譯器在 a=3 后找不到分號(hào),則下一行 b=4 也將作為上一行語句的一部分包含在內(nèi),從而導(dǎo)致語法錯(cuò)誤。編譯時(shí),一行指示有錯(cuò)誤,但該行有時(shí)沒有發(fā)現(xiàn)錯(cuò)誤。必須確保上一行缺少分號(hào)。使用復(fù)合語句時(shí),一些學(xué)習(xí)帕斯卡語言的讀者經(jīng)常遺漏最后一個(gè)語句的分號(hào),例如t=a。a=b;在B=t,PASCAL中,分號(hào)是兩個(gè)不是語句一部分的語句之間的分隔符,而在c中,分號(hào)不是語句。(8)在加分渡邊杏的地方加分號(hào)。示例:if(ab);Printf(aislarger than

8、bn):在執(zhí)行Ab時(shí)輸出“aislarger than b”中的信息。但是,if語句在此結(jié)束,因?yàn)閕f(ab)后面有分號(hào)。也就是說,當(dāng)(ab)為真時(shí)執(zhí)行空語句。想要Ab時(shí)沒有輸出上述信息,但是當(dāng)前printf函數(shù)語句是與if語句平行的語句,與if語句無關(guān)。輸出“a is larger than b”,無論是Ab還是ab。另一個(gè)范例:for(I=0;I10I);Scanf(%d),表示依次輸入10個(gè)數(shù)字,輸入每個(gè)數(shù)字,然后輸出平方值。For()后加分號(hào),使循環(huán)體成為空語句。只能輸入一個(gè)整數(shù),可以輸出平方值。總之,不要在if,for,while語句中畫蛇添加加分。(9)對(duì)于必須有花括號(hào)的復(fù)合句,忘

9、記加上花括號(hào)。例如:總計(jì)=0;I=1;while(I=100)sum=sum I;I;本意是實(shí)現(xiàn)1 2 100,即I。但是,上述語句重復(fù)sum 1的操作,并且循環(huán)從不終止。這是因?yàn)镮的值始終保持不變。錯(cuò)誤是沒有用復(fù)合句的形式寫出來的。因此,while語句的范圍延伸到第一個(gè)分號(hào)。門“I;”不在循環(huán)體范圍內(nèi)。相反,100 i=0,while(I=100)sum=sum I;I;(10)括號(hào)不正確。在一個(gè)語句中使用多層括號(hào)時(shí)經(jīng)常出現(xiàn)這種錯(cuò)誤,純粹是由于粗心所致。例如:while(c=getchar()!=#)put char(c);少了一個(gè)右括號(hào)。(11)使用標(biāo)識(shí)符時(shí)忘記大寫和小寫字母的區(qū)別。例如,

10、主()inta、b、c;a=2;b=3;c=A B;Printf(%d %d=%,a,b,c);編譯時(shí)出錯(cuò)。編譯器徐璐將A和A視為另外兩個(gè)變量名。相同的B和B、C、C分別表示兩個(gè)不同的變量。(12)引用數(shù)組元素時(shí)不正確地使用括號(hào)。示例:main()int I,a(10);for(I=0);I10I)在scanf(%d,c語言中,定義或引用數(shù)組元素時(shí)必須使用方括號(hào)。(13)定義數(shù)組時(shí),將定義的“元素?cái)?shù)”誤認(rèn)為“可用的最大下標(biāo)值”。main () inta10=1,2,3,4,5,6,7,8,9,10;int I;for(I=1);I=10I) printf(%d,ai);我想輸出A1到a10。但

11、是一些初學(xué)者經(jīng)常犯的錯(cuò)誤。c語言規(guī)定定義了a10牙齒,這意味著A數(shù)組有10個(gè)元素,而不是最大下標(biāo)值10牙齒。因?yàn)閿?shù)組僅包含A0到a910個(gè)元素,所以使用a10超出了A數(shù)組的范圍。(14)定義和引用二維或多維數(shù)組的方法無效。主()inta5,4;Printf(%d,a1 2,2 2);對(duì)于二維數(shù)組和多維數(shù)組,在定義和引用每個(gè)維的數(shù)據(jù)時(shí),必須將其括在方括號(hào)中。上述a5、4應(yīng)改為a54、a1 2、2應(yīng)改為A1 2 2。根據(jù)c的語法規(guī)則,一個(gè)方括號(hào)中有一個(gè)維的下標(biāo)表達(dá)式,a1 2,2 2 2大括號(hào)中的“1 2,2 2 2”是逗號(hào)表達(dá)式,它是第二個(gè)數(shù)字表達(dá)式的值。也就是說,2的值為4。所以A1 2,2等

12、于a4。A4是a數(shù)組第四行的第一個(gè)地址。因此,執(zhí)行printf函數(shù)輸出的結(jié)果不是a34的值,而是A數(shù)組第4行的第一個(gè)地址。(15)誤以為數(shù)組名稱表示數(shù)組的所有元素。示例:main () inta4=1,3,5,7;Printf(%d%d%d%dn,a);想用數(shù)組名表示所有元素。在c語言中,數(shù)組名表示數(shù)組的第一個(gè)地址,不能通過數(shù)組名輸出四個(gè)整數(shù)。(16)混淆文字陣列和文字指標(biāo)之間的差異。主()charstr4Str=電腦和c;Printf(%sn,str);編譯錯(cuò)誤。Str是表示數(shù)組第一個(gè)地址的數(shù)組名。編譯時(shí)將內(nèi)存單元分配給str數(shù)組,因此在節(jié)目執(zhí)行過程中,str是常量,不能再指定任何值。因此,

13、str=Computer and c 無效。如果“char str4”“charstr”變更為,程序正確。str是指向文字?jǐn)?shù)據(jù)的指針變量,str=Computer and c 合法,在指針變量str中指定字符串的第一個(gè)地址,然后在printf函數(shù)語句中輸出字符串 Computer and c 。因此,您必須知道文字陣列與使用文字指標(biāo)變數(shù)之間的差異。(17)在引用指針變量之前沒有指定值。主()車* p;Scanf(%s,P):引用指針變量P而不分配值,并在編譯時(shí)提供警告消息。必須換成Charp,C20。p=c;Scanf(%s,P):也就是說,根據(jù)需要定義大小合適的字符數(shù)組C,然后將C數(shù)組的第一

14、個(gè)地址分配給指針變量P。此時(shí),P具有指向數(shù)組C的特定值。再次運(yùn)行Scanf函數(shù)沒有問題。將從鍵盤輸入的字符串存儲(chǔ)在字符數(shù)組C中。(18) switch語句的每個(gè)分支中缺少break語句。例如:switch(score)case 5:printf(ery good)!);案例4: printf(好!);第3類:printf(Pass!);案例2: printf (fail!);Defult: printf(數(shù)據(jù)錯(cuò)誤!);上述switch語句希望根據(jù)“score(分?jǐn)?shù))”打印說明。但是,如果score值為5,則ery Good!道德!Pass!佩爾!Data error!原因是缺少break語句。

15、Case只是標(biāo)簽角色,不進(jìn)行判斷,因此,在執(zhí)行第一個(gè)printf函數(shù)語句后,將執(zhí)行第二個(gè)、第三個(gè)、第四個(gè)和第五個(gè)printf函數(shù)語句。交換機(jī)(score) case 5: printf (ery good!);布列克;案例4: printf(好!);布列克;第3類:printf(Pass!);布列克;第2類:print(Fail!);布列克;Defult: print(數(shù)據(jù)錯(cuò)誤!);(19)將字符和字符串的表示混淆。Char sexsex=M;Sex是只能存儲(chǔ)一個(gè)字符的文字變量。字符常量的形式用單引號(hào)括起來,因此必須將其替換為sex=M。“m”是用雙引號(hào)括起來的字符串,由兩個(gè)字符(m和0)組成

16、,不能存儲(chǔ)在文字變量sex中。使用、(20)自身加()和自身減(-)運(yùn)算符時(shí)發(fā)生的錯(cuò)誤。例如,main() intp,a5=1,3,5,7,9;p=a;Printf(%d,* p);很多人認(rèn)為 *p 的作用是先指向P加1,即第一個(gè)元素a1,然后輸出第一個(gè)元素a1的值3。事實(shí)上,首先要執(zhí)行P,P的作用是先使用P的原始值,寫完后再給P加1。*p是第0個(gè)元素A0的值1,因?yàn)閜的原始值指向數(shù)組A中的第0個(gè)元素A0。結(jié)論是先輸出A0的值,然后對(duì)P加1。如果*(p),則首先使p指向a1,然后輸出a1的值。(21)有些人習(xí)慣以傳統(tǒng)方式聲明函數(shù)類型參數(shù),但同時(shí)定義了函數(shù)的格式參數(shù)和函數(shù)的局部變量。例如:最大(

17、x,y) int x,y,=xy?x,y;return();必須更改為max(x,y) int x,y。Int=xy?x:y;return();(22)調(diào)用的函數(shù)是在調(diào)用語句之后定義的,在調(diào)用之前不進(jìn)行說明。主()float x,y,x=35y=-76;=最大值(x,y);Printf(%fn,);Float max(float x,float y) return(=xy?x:y);牙齒程序乍一看似乎沒有問題,但編譯時(shí)有錯(cuò)誤信息。這是因?yàn)閙ax函數(shù)是真實(shí)的,并且在main函數(shù)之后定義。也就是說,max函數(shù)在從main函數(shù)調(diào)用的max函數(shù)之后定義。無效方法可以使用以下方法之一:也就是說,向main函數(shù)添加max函數(shù)的宣言,即函數(shù)的原型。main() float max(float,float);/*要使用的max函數(shù)為實(shí)數(shù)*/float x,y,X=35y=-76;=最大值(x,y);Printf(%fn,);將Max函數(shù)的定義位置調(diào)整到main函數(shù)前面。也就是說,float max(float x,float y) return(=xy?x:y);主()float x,y,X=35y=-76;=最大值(x,y);Printf(%fn,);這樣可以確保編譯時(shí)不發(fā)生

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論