如果在寫C語言時,代碼沒錯,但是結果總錯是什麼原因?

龍建源


從代碼到可執行程序包括以下幾個方面:

1.代碼編譯通過

代碼編譯通過是生成可執行程序鎖必須的,編譯不通過則說明代碼中有明顯的錯誤,比如類型轉換錯誤、返回值缺失、符號使用錯誤等等。編譯錯誤在開發環境中一般都能精確定位,是比較容易發現和解決的。代碼編譯通過,只能說明代碼中沒有明顯的語法錯誤。

2.可執行程序運行

編譯通過後,會生成可執行程序(或者動態庫,題主應該說的是可執行程序,所以此處直接說可執行程序),在開發環境中點擊“運行”,如果代碼沒有錯誤(如內存溢出),一般都能正常顯示,如果是黑窗口,則需要在main函數最後添加中斷函數,否則會一閃而過。可執行程序能跑起來,則說明代碼沒有明顯的錯誤。但不代表代碼實現了想要的功能。

3.程序的邏輯

在程序開發過程中,如果1和2都沒問題,但是程序運行達不到自己期望的結果,那有極大的概率是代碼的邏輯有問題,一個細小的邏輯錯誤,往往會導致莫名其妙的錯誤,所以,如果程序沒達到理想的結果,就仔細研究一下代碼的邏輯。

4.其它的問題

以上3個方面幾何可以解決90%以上的程序問題,但還有一些莫名其妙的情況,比如函數理解錯誤,參數設置錯誤,等等一些不常見的問題。還有一些是疏忽,編碼從來都不是一帆風順的,BUG常伴程序。


天碼行空


寫c語言的時候,如果代碼沒錯,這隻能說明語法沒有出錯,直接導致的結果就是能編譯通過,並不意味著執行的結果就是正確的。影響c語言代碼執行結果的因素非常多。

一、指針的不正確運用;

二、變量精度問題。char,int,unsigned int,long ,float等,如果變量精度使用不正確,也會影響運算結果;

三、運算符的應用不正確。例如除,取餘的區別;

四、正負符號位;

五、運算符的優先級使用;

六、編譯器不同。各種編譯器也可能造成結果不一致;

C語言雖然是一門比較簡單的語言,但是要掌握這些細節,其實並不容易。


重點吐槽


我是碼中尋樂,很高興能為你解答。

代碼沒錯,估計題主表達的意思是能正常編譯通過吧,只要沒有語法錯誤,都會編譯通過的,但並不代表代碼沒錯,這是兩個概念。結果總是錯,說明代碼有錯誤,需要進一步調試排查。

考慮如下代碼:

從語法上來講它們都沒有錯,能正常編譯通過,也能執行。但是輸出的結果卻跟預估的不一樣,看起來結果似乎是錯誤的?

為什麼fv的輸出不是5.567891534? 為什麼cv的輸出不是129?

其實都是有原因的,單精度浮點類型float的小數點後有效位只有6位,後面的會四捨五入; 有符號字符類型的數值表達範圍是-128~127, 而此處被賦值129,已經溢出了,按它的二進制佈局就是10000001,最高位是符號位,1是負數, 將後面7位取反再加一就是1111111,其值為127,帶上符號就是-127。

所以看似錯誤的結果其實是必然,關鍵是要自己明白究竟錯誤的是什麼。


碼中尋樂


有一次真實的經歷,有一段代碼有多種情況分別處理,我是用switch case來寫的,結果有一個case始終執行不到,使用調試器跟蹤發現,即使條件滿足,也無法進入這個case的執行,多次檢查代碼也沒有發現什麼問題。最後從周圍找了幾個高手,也沒有發現問題。

真是困惑不解了,後來沒有辦法了,就把switch case改成if ...else if,問題居然就解決了,真是太神了。

後來想可能是編譯器有問題,我們的環境是風河嵌入式系統,編譯器也是他們提供的。


黃河邊


編程錯誤不一定是語法錯誤,也有可能是邏輯錯誤,語法錯誤很好排除,邏輯錯誤很難發現和排除,一行一行debug有時候比重構代碼還麻煩。如果是小項目,最好把算法流程畫清楚,框架要做到心中有數,大項目的話,老實debug吧


手工浩哥


以我為時不長的7年開發經驗告訴你,永遠不要先懷疑機器,環境,99.99999%是自己寫的bug,不過話說回來,不寫bug不就失業了[捂臉][捂臉][捂臉]


愛吃火鍋的小青年


大概率邏輯問題,很多人很多時候寫代碼都不喜歡畫流程圖,結果導致流程中有邏輯細節問題;

小概率環境問題,運行環境不一樣,可能導致偏差!


Hdxnx


顯示器壞了


黑麵饅頭23439542


既然結果錯了,那肯定是代碼有錯


絕世痞子1


你說的沒錯應該是指語法沒報錯的。但是邏輯錯了怎麼辦呢?比如你有個地方忘記賦值,忘記自增,

==打成了=變成了賦值。


分享到:


相關文章: