-
1 # 使用者342654797228796
-
2 # 碼中尋樂
程式碼沒錯,估計題主表達的意思是能正常編譯透過吧,只要沒有語法錯誤,都會編譯透過的,但並不代表程式碼沒錯,這是兩個概念。結果總是錯,說明程式碼有錯誤,需要進一步除錯排查。
考慮如下程式碼:
從語法上來講它們都沒有錯,能正常編譯透過,也能執行。但是輸出的結果卻跟預估的不一樣,看起來結果似乎是錯誤的?
為什麼fv的輸出不是5.567891534? 為什麼cv的輸出不是129?
其實都是有原因的,單精度浮點型別float的小數點後有效位只有6位,後面的會四捨五入; 有符號字元型別的數值表達範圍是-128~127, 而此處被賦值129,已經溢位了,按它的二進位制佈局就是10000001,最高位是符號位,1是負數, 將後面7位取反再加一就是1111111,其值為127,帶上符號就是-127。
所以看似錯誤的結果其實是必然,關鍵是要自己明白究竟錯誤的是什麼。
-
3 # 資料結構
你說的沒錯應該是指語法沒報錯的。但是邏輯錯了怎麼辦呢?比如你有個地方忘記賦值,忘記自增,
==打成了=變成了賦值。
-
4 # 黃河邊
有一次真實的經歷,有一段程式碼有多種情況分別處理,我是用switch case來寫的,結果有一個case始終執行不到,使用偵錯程式跟蹤發現,即使條件滿足,也無法進入這個case的執行,多次檢查程式碼也沒有發現什麼問題。最後從周圍找了幾個高手,也沒有發現問題。
真是困惑不解了,後來沒有辦法了,就把switch case改成if ...else if,問題居然就解決了,真是太神了。
後來想可能是編譯器有問題,我們的環境是風河嵌入式系統,編譯器也是他們提供的。
-
5 # 深飄強哥
寫c語言的時候,如果程式碼沒錯,這隻能說明語法沒有出錯,直接導致的結果就是能編譯透過,並不意味著執行的結果就是正確的。影響c語言程式碼執行結果的因素非常多。
一、指標的不正確運用;
二、變數精度問題。char,int,unsigned int,long ,float等,如果變數精度使用不正確,也會影響運算結果;
三、運算子的應用不正確。例如除,取餘的區別;
四、正負符號位;
五、運算子的優先順序使用;
六、編譯器不同。各種編譯器也可能造成結果不一致;
C語言雖然是一門比較簡單的語言,但是要掌握這些細節,其實並不容易。
-
6 # 霹靂263521714453
程式碼沒錯? 你這麼確定? 只要結果不是你的預期就是程式碼的錯誤 對於所有程式語言都一樣 只不過c語言底層耦合度高所有比別的語言要更細心
-
7 # 科技專家
美好一天很榮幸為大家解答這個問題,讓我們一起走進這個問題,現在讓我們一起探討一下。
有一次真實的經歷,有一段程式碼有多種情況分別處理,我是用switch case來寫的,結果有一個case始終執行不到,使用偵錯程式跟蹤發現,即使條件滿足,也無法進入這個case的執行,多次檢查程式碼也沒有發現什麼問題。最後從周圍找了幾個高手,也沒有發現問題。
真是困惑不解了,後來沒有辦法了,就把switch case改成if ...else if,問題居然就解決了,真是太神了。
後來想可能是編譯器有問題,我們的環境是風河嵌入式系統,編譯器也是他們提供的。
在以上的分享關於這個問題的解答都是個人的意見與建議,我希望我分享的這個問題的解答能夠幫助到大家。
-
8 # Hdxnx
大機率邏輯問題,很多人很多時候寫程式碼都不喜歡畫流程圖,結果導致流程中有邏輯細節問題;
小機率環境問題,執行環境不一樣,可能導致偏差!
-
9 # 愛吃火鍋的小青年
以我為時不長的7年開發經驗告訴你,永遠不要先懷疑機器,環境,99.99999%是自己寫的bug,不過話說回來,不寫bug不就失業了[捂臉][捂臉][捂臉]
-
10 # 手工浩哥
程式設計錯誤不一定是語法錯誤,也有可能是邏輯錯誤,語法錯誤很好排除,邏輯錯誤很難發現和排除,一行一行debug有時候比重構程式碼還麻煩。如果是小專案,最好把演算法流程畫清楚,框架要做到心中有數,大專案的話,老實debug吧
-
11 # BWanger軟體開發達人
我想你要表達的是,編繹時,沒顯示出錯,但就是結果錯了。要細緻地找原因。
根據我以往的經驗,原因有以下幾點。
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......
-
12 # 棒槌121
程式碼肯定有錯,不過c的話,因為總是要操作記憶體,有時候記憶體破壞了,比較常見的是寫越界了,導致使用那段記憶體的程式碼總報錯,而那段程式碼本身是沒錯的
-
13 # mubaohong
錯誤有兩種:語法錯誤和邏輯錯誤。
前者,編譯過程中編譯器會報錯。
後者,就是程式有錯。例如,c語言不做越界檢查,陣列越界不報錯,但結果不正確。還有未初始化就引用值,等等。
所以你的問題本身就是錯誤,先設定自己沒錯,再問是誰的錯。
軟體工程:沒有錯誤是不可能的,唯一不變的就是錯誤本身。
出了錯。先得懷疑一切,一步步排除錯誤,而不是堅持自己沒錯。
-
14 # 四葉草之星星
這問題就是矛盾的,假設沒有錯,那結果肯定是正確的,假設有錯,那結果就是正確的。你的問題是程式碼沒有錯,結果是錯誤的,不符合邏輯,所以程式碼肯定是錯的.
-
15 # 姓wang有錯嗎
你寫的程式碼,如果你覺得你的程式碼沒錯,但是執行出錯了,可以肯定的告訴你,說明你的知識還不夠,可能是語言層面,可能是邏輯問題,可能是編譯最佳化,可能是作業系統相關,反正一句話就是在你有限的知識體系內,根本不知道問題所在,所以才有此疑問。把你的錯誤放到stackoverflow上一查就出來了。相信我,你不是第一個遇到同樣問題的人。
-
16 # 哇咔咔n97
我記得朋友和我說過一個國外的技術大牛,他說他寫的程式碼邏輯絕對不會有錯,如果有錯了,一定是編輯器bug,難道這個人就是你??
-
17 # 我不是間諜
可能性很多,比如小數點截斷,機器位數不同,編譯器版本不同,你輸入逗號是中文字元,編譯器程式碼檢查的要求不同,比如你用c語言的語法編譯器標準卻是c++11,很多語法都不允許這麼寫了。
-
18 # 龍鳳寶爸育兒記錄
根據您的描述,首先排除您的程式碼語法上出現錯誤,因為這種錯誤在程式碼編譯時,編譯器就會報錯,這種錯誤相對容易好找。
然後就是查詢程式碼邏輯上的錯誤,將自己的構思透過畫流程圖展示出來,然後將程式執行的流程和自己的構思流程對照是否吻合。
之後再查詢欄位的資料型別是否正確,比如如果儲存型別為小數時,必須定義為float或double型別,否則顯示結果肯定跟預期的完全不一樣。
最後如果還是程式執行錯誤,那麼恭喜你,發現了編譯器的BUG了!
-
19 # NICHOLAS55184785
碰到過,但其實還是程式碼錯,微控制器msp430引腳高低的暫存器,應該用v開頭的那個修飾的,結果沒寫,被最佳化掉了
-
20 # HOPEAMOR
如果你是照書敲得,可能是編譯器版本問題,書中程式碼很早,呼叫庫也是有區別的,另外可能和設定有關,亦或者之前的不安全不嚴格的形式,在新的編譯器後進行了嚴格的限制
回覆列表
結果錯,不就剛好證明了你錯了嗎?你說程式碼沒錯,是語法沒錯,考慮不全面,邏輯錯不算錯嗎?你沒有想到的事,他就不存在嗎?