首頁 > 運動

0可以當成被除數嗎?c語言程式中的錯千奇百怪,你知道是什麼嗎?

由 IT劉小虎 發表于 運動2021-05-30

簡介程式設計師之前沒有考慮到這種情況,所以沒有告訴計算機該如何處理,死板的計算機自己又懶得思考,所以出現這種錯誤時,直接草草結束掉程式了事

0可以當成被除數嗎

在前面 15 節的介紹中,我們寫了不少 linux 中的C語言程式。相信大家也發現了,即使再簡單的C語言程式,也是有可能寫錯的,畢竟人不是機器。

linux 中的程式錯誤

寫C語言程式出的錯千奇百怪,有的是手誤寫錯了符號,有的是頭腦發熱寫反了邏輯,甚至有時還會寫錯數字。語法錯誤,編譯器能夠直接指出,對照著修正沒有什麼難度。邏輯出錯的程式才叫人頭疼,這類程式能夠編譯透過,卻得不到正確結果,因為沒有編譯器幫忙,只能由程式設計師自己去找錯誤修正。

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

程式邏輯出錯大體可以分為兩種

一是出錯時,程式不會退出,可以繼續往下執行。例如呼叫 open 函式開啟檔案失敗,程式不會退出,還能執行程式設計師設定的錯誤處理語句,例如列印錯誤資訊等。

一是一旦出錯,程式就直接崩潰退出。比如非法操作記憶體引起的段錯誤(這種錯誤在大型專案開發中經常出現),再例如把 0 當作被除數的浮點錯誤等。

第一種錯誤可以勉強認為是預料之中的錯誤。以 open 函式為例,在定義 open 函式時就已經考慮可能會出現的各種情況了:大多數情況下,open 函式能夠成功開啟檔案。但是在許可權不足,或者開啟方式不正確時,的確會出現 open 函式開啟檔案失敗的情況。

程式設計師在定義 open 函式時,會盡力將所有可能的情況都納入考慮,最後看起來好像 open 函式本身就具有處理錯誤的能力,輸入 man 命令查詢其手冊:

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

得知 open 函式在成功開啟檔案時,會返回檔案描述符。如果開啟檔案出錯,它就會返回 -1,並且可以根據 errno 查詢出錯原因。不管 open 函式執行成功還是出錯,所有的情況都在考慮中。

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

不管成功還是出錯,open 函式都告訴計算機該如何處理,所以即使出錯,程式也不會意外退出。

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

第二種錯誤則完全出乎意料之外了。程式設計師之前沒有考慮到這種情況,所以沒有告訴計算機該如何處理,死板的計算機自己又懶得思考,所以出現這種錯誤時,直接草草結束掉程式了事。

例如,程式設計師不小心讓 0 做被除數了:

#include int main(){ int a = 8/0; printf(“%d\n”, a); return 0;}

這時程式處理不了 8/0 的計算,只好罷工,直接退出:

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

設計程式要考慮全面

第二種錯誤的癥結往往很隱蔽,要從幾萬行甚至幾十萬行程式碼中找出錯誤的原因,難度可想而知。所以,程式設計師在編寫程式碼時,要將所有可能會發生的事情都考慮到,否則就可能會出現第二種錯誤。

例如下面這個問題:

編寫 C語言程式,取 100 個最大值為 10 的隨機數 num,打印出 100/num 的值。

這個問題是簡單的,很快就能寫出程式:

#include #include int main(){ char i, j = 100; while(j——){ i = rand()%10; printf(“num %d: %d\n”, 100-j, 100/i); } return 0;}

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

編譯執行,發現程式並沒能按照預期的效果執行:

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

程式只打印了 12 個數就退出了,並且提示“Floating point exception”,這就是因為沒有考慮隨機值 i 可能等於 0。因為 i 的值是隨機的,程式設計師並不能準確的得到程式出錯的時機,如果這個錯誤隱藏在幾十萬行程式碼裡,想像一下這個錯誤的可怕吧。

所以,程式設計師一定要足夠細心,把所有可能的情況都要考慮到。以上程式碼可以改寫為:

#include #include int main(){ char i, j = 100; while(j——){ i = rand()%10; if(i) printf(“num %d: %d\n”, 100-j, 100/i); else printf(“num %d: inf\n”, 100-j); } return 0;}

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

只有當 i 不為 0 的時候才計算 100/i,i等於0的時候,打印出 inf。這下,程式終於可以正常工作了:

我是一個粗心的人,能學習C語言程式設計嗎?朋友說程式設計師都得很細心

看來,程式設計師都該是心思縝密的人。

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

Tags:Open100程式程式設計師出錯