首先宣告:這些內容主要是面向
c語言的初學者,尤其是正在學習
c語言的學生。 在《
c語言字元型資料(一)
#include "stdio.h"
int main()
printf("%c",ch);
ch = getchar(); }
return 0; }
有乙個學生在練習上述程式時,誤將
while(ch!=eof)
寫成了while(ch=!eof)
,程式編譯通過,執行後,
result.txt
檔案中什麼結果都沒有。花了很長時間才最終發現了這個錯誤。其實很多初學者都曾犯過類似的錯誤。比如,在寫
if語句的條件時,也很容易將
if(ch!=eof)
寫成if(ch=!eof)
,或者本來是判斷是否相等
if(ch==』a』)
,結果寫成了
if(ch=』a』)
。對初學者而言,最大的困難是這類錯誤並沒有語法問題,從而很難查詢,這也是
c語言靈活性的乙個體現。下面我們先分析錯誤的原因,再給出解決方法。
錯誤分析:
while
後面的括號中可以是任何表示式,表示式首先被求值,然後判斷該值的真假,
c語言判斷真假的規則是:零是假,非零的值都為真。當寫成
ch=!eof
時,這實際上是乙個賦值表示式,因為感嘆號現在是邏輯運算子「非」,它的優先順序高於賦值「
=」,所以
ch=!eof
等價於ch=
(!eof
)。eof
是乙個常量,等於
-1(非零為真),所以
!eof
的值為假,注意邏輯表示式求值後的真假是用1和
0來表示的,因此
!eof
的值為0,ch
也被賦值為
0,表示式
ch=!eof
的值等於
ch的值,也為
0。因此,
while
後面的條件恒為假,迴圈體一次都沒有執行。這就是為什麼
result.txt
檔案中什麼結果都沒有。
解決方法:
1.有牛人曾經給出過乙個解決方案:在寫
while
或者if
後面的條件時,把常量寫在左面,變數寫在右邊。這樣寫的好處是,當寫錯運算子時,編譯會報錯。比如上面的例子,建議寫成
while(eof!= ch)
,這樣寫並不影響判斷,但如果誤寫為
while(eof=!ch)
,編譯時會報錯,因為
eof是乙個常量,常量是不能被賦值的。這樣就很容易糾正錯誤。 2.
適當加入斷言來防止錯誤的發生。比如上面的程式中,如果
while
迴圈正常結束的話,
ch應該等於
eof,因此我們可以斷言迴圈結束後
ch等於
eof。加了斷言的程式如下所示:
#include "stdio.h"
#include"assert.h"
int main()
printf("%c",ch);
ch = getchar(); }
assert(c==eof);//
正常情況下,迴圈結束時,
c==eof
,斷言是正確的。當
while
後面的表示式寫錯時,迴圈
//一次都沒有執行,這時
c!=eof
,因此斷言會報錯。
return 0; }
初學者可以自己上機去試試上面的程式,看斷言報錯的結果是怎樣的。
斷言 錯誤處理與資料對齊
斷言是一種可用於判斷程式設計或執行是否符合開發者預期的邏輯判斷式,通常用於進行 除錯,詳細資訊見文件。斷言分為靜態斷言和執行時斷言,前者在編譯時進行處理,後者在執行過程中進行處理。靜態斷言主要用來約束程式在編譯時需要滿足的一定要求,使用函式為 static assert,比如檢查計算結果和程式的編譯...
vs 下的 斷言錯誤
出現 debug assertion failed錯誤 是因為你程式中的斷言失敗了,也就是這一句話 assert pactivateview this assert是system.diagnostics.debug類的乙個靜態方法,只在debug的狀態下起作用,如果程式是編譯成release的,那麼...
C 斷言與靜態斷言 1
c 斷言與靜態斷言 斷言是很早之前就有的東西了,只需要引入cassert標頭檔案即可使用。往往assert被用於檢查不可能發生的行為,來確保開發者在除錯階段盡早發現 不可能 事件真的發生了,如果真的發生了,那麼就表示 的邏輯存在問題。最好的一點就是,斷言只在debug中生效,因此對於release版...