W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
編程是個復(fù)雜的過程,而且因為由人來完成,所以難免出現(xiàn)錯誤。由于一些特殊的原因,編程錯誤稱為“bug”,而跟蹤和修正錯誤的過程稱為“debugging”,中文叫做調(diào)試。
程序中會出現(xiàn)幾種不同類型的錯誤,分清這幾類錯誤有助于快速找出問題。
編譯器只能翻譯語法正確的程序,當(dāng)存在語法問題時,編譯失敗,你也就無從運行程序了。語法指程序的結(jié)構(gòu)和結(jié)構(gòu)的規(guī)則。
例如,英語中的句子必須以大寫字母開頭并以句號結(jié)尾。不以大寫字母開頭或者不以句號結(jié)尾的句子在語法上都是錯誤的。
對大多數(shù)讀者而言,語法錯誤不是個嚴(yán)重問題,我們讀e e cummings的詩歌時并不會感覺到很多語法錯誤就是這個原因。
編譯器可沒這么寬容。程序中不管哪里出現(xiàn)了一個語法錯誤,編譯器都會打印錯誤信息并退出,結(jié)果就是沒辦法執(zhí)行程序。
更麻煩的是,C++中的語法規(guī)則比英語要多得多,而且編譯器給出的錯誤提示信息不見得總有用。在我們剛學(xué)著編程的前幾周,你可能要花很多時間來查找語法錯誤。隨著經(jīng)驗的增長,你犯的錯會越來越少,找出錯誤也會更快。
第二類錯誤是運行時錯誤,因為這類錯誤在程序運行時才會出現(xiàn)。
下面幾周我們編寫的都是很簡單的程序,運行時錯誤非常少見,可能過一段時間才會遇到。
第三類錯誤是邏輯或語義錯誤。如果程序中有邏輯錯誤,程序仍會正確編譯并運行,編譯器不會生成任何錯誤消息,但是程序運行得不到預(yù)期結(jié)果。程序執(zhí)行的不是你需要的功能。其實,你讓程序做什么它就做什么,問題在于,你寫出的代碼和你本來要設(shè)計的功能并不一致。也就是說,程序的語義錯了。識別邏輯錯誤可能很復(fù)雜,因為這需要你根據(jù)程序的輸出和找出程序到底在做什么來倒推問題所在。
調(diào)試應(yīng)該是你能從本書中學(xué)到的最重要的一個技能。雖然調(diào)試過程中可能有挫敗感,但調(diào)試是編程中最具智慧、挑戰(zhàn)和樂趣的部分之一。
從某種角度看,調(diào)試就像偵探工作。你要根據(jù)線索來推理各種過程和事件,最終找到結(jié)果。
調(diào)試又像做實驗。一旦意識到出了問題,你就要修改程序并重新嘗試。如果所做的假設(shè)正確,你就能預(yù)測對修改后的結(jié)果,這就離正確的程序又近了一步。如果假設(shè)錯誤,你就要提出新的假設(shè)。就像夏洛克?福爾摩斯所說的,“排除了那些不可能的之后,無論剩下什么,即使再不可思議,也一定是真相”(出自柯南道爾的《四簽名》一書)。
對某些人而言,編程和調(diào)試是一回事。編程就是逐步調(diào)試程序直到它滿足要求為止。這其中的理念是,總是從一個實現(xiàn)部分功能、可以工作的程序開始,然后加以小的改進(jìn)并隨手調(diào)試通過,這樣保證總是有一個可用的程序。
比如Linux,它是個包含成千上萬行代碼的操作系統(tǒng),最開始卻是Linus Torvalds為探索Intel 80386芯片的功能而開發(fā)的一個簡單程序。據(jù)Larry Greenfield所說,“Linus Torvalds早期有個項目,是交替打印AAAA和BBBB的程序,這個程序后來發(fā)展為了Linux”(出自The Linux Users' Guide Beta版1)。
后續(xù)章節(jié)會有更多有關(guān)調(diào)試和其他編程實踐的建議。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: