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

龍建源


很高興回答答主的問題,希望我的回答對答主有幫助。

根據您的描述,首先排除您的代碼語法上出現錯誤,因為這種錯誤在代碼編譯時,編譯器就會報錯,這種錯誤相對容易好找。

然後就是查找代碼邏輯上的錯誤,將自己的構思通過畫流程圖展示出來,然後將程序運行的流程和自己的構思流程對照是否吻合。

之後再查詢字段的數據類型是否正確,比如如果存儲類型為小數時,必須定義為float或double類型,否則顯示結果肯定跟預期的完全不一樣。

最後如果還是程序運行錯誤,那麼恭喜你,發現了編譯器的BUG了!🤫


星辰龍鳳寶爸


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

一、指針的不正確運用;

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

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

四、正負符號位;

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

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

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


重點吐槽


我想你要表達的是,編繹時,沒顯示出錯,但就是結果錯了。要細緻地找原因。

根據我以往的經驗,原因有以下幾點。

1,內存沒有釋放。

用new,malloc等分配內存,而在結束時來釋放,頻繁調用,系統崩潰。

或者根本沒使用new或malloc,在使用內存時異常。

2,變量與地址用錯。

char *p;

char cp

第一個p指地址,在程序中用錯。

3,畫筆CPen,CStatic等未恢復

如:oldpen=pdc一>SelectObject(&m_pen);

在結束,沒有pdc一>SelectObject(oldpen);

導致顏色混亂。

4,中斷使用不當,或者回調callback函數使用不當.

5,c語言對變量類型有嚴格要求,unsigned與signed區別還是很大的,詳細檢查函數原型。

6,最後檢查算法,框圖。是否基本算法有誤。這個很難做。相信大家都很自負,堅信算法沒錯。對照數學算法與你的程序算法是否一致。

7,浮點運算。相信大家認為1.0十1.0=2.0無疑。如果double與其它變量轉換出問題,沒準是這樣的結果:

1.0十1.0=1.9999999999......





beijingwanger


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

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

考慮如下代碼:

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

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

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

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


碼中尋樂


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

1.代碼編譯通過

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

2.可執行程序運行

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

3.程序的邏輯

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

4.其它的問題

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


天碼行空


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

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

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


黃河邊


可能性很多,比如小數點截斷,機器位數不同,編譯器版本不同,你輸入逗號是中文字符,編譯器代碼檢查的要求不同,比如你用c語言的語法編譯器標準卻是c++11,很多語法都不允許這麼寫了。


我不是間諜


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


手工浩哥


錯誤有兩種:語法錯誤和邏輯錯誤。

前者,編譯過程中編譯器會報錯。

後者,就是程序有錯。例如,c語言不做越界檢查,數組越界不報錯,但結果不正確。還有未初始化就引用值,等等。

所以你的問題本身就是錯誤,先設定自己沒錯,再問是誰的錯。

軟件工程:沒有錯誤是不可能的,唯一不變的就是錯誤本身。

出了錯。先得懷疑一切,一步步排除錯誤,而不是堅持自己沒錯。


mubaohong


碰到過,但其實還是代碼錯,單片機msp430引腳高低的寄存器,應該用v開頭的那個修飾的,結果沒寫,被優化掉了


分享到:


相關文章: