原文網址 http://hi.baidu.com/lanyi_522/blog/item/c944663412e248bcd0a2d309.html
1 邏輯錯誤與語法錯誤
在編程時,出現的錯誤可能有邏輯錯誤和語法錯誤兩種。這兩種錯誤的發生原因和處理
方法是不同的。本節將講述這兩種錯誤的處理方法。
邏輯錯誤指的是程式的設計思路發生了錯誤。這種錯誤在程式中是致命的,程式可能
正常編譯通過,但是結果是錯誤的。當程式正常運行而結果錯誤時,一般都是編程的
思路錯誤。這時,需要重新考慮程式的運算方法與資料處理流程是否正確。
語法錯誤:語法錯誤指的是程式的思路正確,但是在書寫語句時,發生了語句錯誤。
這種錯誤一般是編程時不小心或是對語句的錯誤理解造成的。在發生語句錯誤時,程
序一般不能正常編譯通過。這時會提示錯誤的類型和錯誤的位置,按照這些提示改正
程式的語法錯誤即可完成錯誤的修改。
2 C 程式中的錯誤與異常
C 程式中的錯誤,根據嚴重程式的不同,可以分為異常與警誤兩類。在編譯程序時,這
兩種情況對編譯的影響是不同的,對錯誤與異常的處理方式是不同的。
1.什麼是異常
異常指的是代碼中輕微的錯誤,這些錯誤一般不會影響程式的正常運行,但是不完全符
合編程的規範。在編譯程序時,會產生一個“警告”,但是程式會繼續編譯。下面的程式會使
程式發生異常,在編譯時產生一個警告錯誤。
在除法中,0 作除數。
在開方運算時,對負數開平方。
程式的主函數沒有聲明類型。
程式的主函數沒有返回值。
程式中定義了一個變數,但是沒有使用這個變數。
變數的存儲發生了溢出。
2.什麼是錯誤
錯誤指的是程式的語法出現問題,程式編譯不能正常完成,產生一個錯誤資訊。這時會
顯示錯誤的類型與位置。根據這些資訊可以對程式進行修改。
3 編譯中的警告提示
在編譯程序時,如果發生了不嚴重的異常,會輸出一個錯告錯誤,然後完成程式的編譯。
例如下面的內容是一個程式在編譯時產生的警告。
5.1.c: In function 'main':
5.1.c:16: 警告:‘main’ 的返回類型不是 ‘int’
5.1.c:18: 警告:被零除
這些的含義如下所示。
(1)“In function 'main':”表示發生的異常在main 函數內。
(2)“5.1.c:16:”表示發生異常的檔是5.1.c,位置是第16 行。
(3)下面的資訊是第16 行的異常,表明程式的返回類型不正確。
‘main’ 的返回類型不是 ‘int’
(4)下面的警告資訊表明程式的第18 行有除數為0 的錯誤。
5.1.c:18: 警告:被零除
1.8.4 找不到包含檔的錯誤
程式中的包含檔在系統或工程中一定要存在,否則程式編譯時會發生致命錯誤。例如
下面的語句包含了一個不正確的頭檔。
#include
編譯程序時,會發生錯誤,錯誤資訊如下所示。
5.1.c:2:20: 錯誤:stdio2.h:沒有那個檔或目錄
1.8.5 錯誤地使用逗號
程式中逗號的含義是並列幾個內容,形成某種演算法或結構。程式中如果錯誤地使用逗號,會
使程式在編譯時發生致命錯誤。例如下面的代碼,是程式中的if 語句後面有一個錯誤的逗號。
int max(int i,int j )
{
if(i>j),
{
return(i);
}
else
{
return(j);
}
}
程式編譯時輸出的錯誤資訊如下所示。表明max 函數中逗號前面的運算式有錯誤,實際
上的錯誤是多一個逗號。
5.1.c: In function ‘max’:
5.1.c:4: 錯誤:expected expression before ‘,’ token
5.1.c: In function ‘max’:
1.8.6 括弧不匹配錯誤
程式中的引號、單引號、小括弧、中括弧、大括弧等符號必須成對出現。這方面的錯誤
會使程式發生符號不匹配的錯誤。發生這種錯誤後,編譯程序往往不能理解代碼的含義,也
不能準確顯示錯誤的位置,而是顯示運算式錯誤。例如下面的代碼,在最後一行上了一個花
括弧。
int max(int i,int j )
{
if(i>j)
{
return(i);
}
else
{
return(j);
}
編譯程序時,會顯示下面的錯誤資訊。
5.1.c:22: 錯誤:expected declaration or statement at end of input
1.8.7 小括弧不匹配錯誤
程式中的小括弧一般在一行內成對出現並且相匹配。小括弧不匹配時,程式發生致命錯
誤。例如下面的代碼,第一行多了一個右半邊括弧。
if(i>j))
{
return(i);
}
else
{
return(j);
}
編程程式時,會發生下面的錯誤。顯示括弧前面有錯誤,並且導致下面的else 語句也有
錯誤。
5.1.c:4: 錯誤:expected statement before ‘)’ token
5.1.c:8: 錯誤:expected expression before ‘else’
1.8.8 變數類型或結構體聲明錯誤
程式中的變數或結構體的名稱必須正確,否則程式會發生未聲明的錯誤。例如下面的代
碼,用一個不存在的類型來聲明一個變數。
ch a;
程式在運行時,會顯示出這個變數錯誤,並且會顯示有其他的錯誤。
5.1.c:17: 錯誤:‘ch’ 未聲明 (在此函數內第一次使用)
5.1.c:17: 錯誤:(即使在一個函數內多次出現,每個未聲明的識別字在其
5.1.c:17: 錯誤:所在的函數內只報告一次。)
5.1.c:17: 錯誤:expected ‘;’ before ‘a’
1.8.9 使用不存在的函數的錯誤
如果程式引用了一個不存在的函數,會使用程式發生嚴重的錯誤。例如下面的代碼,引
用了一個不存在的函數add。
k=add(i,j);
程式顯示的錯誤資訊如下所示,表明在main 函數中的add 函數沒有定義。
/tmp/ccYQfDJy.o: In function `main':
5.1.c:(.text+0x61): undefined reference to `add'
collect2: ld 返回 1
5.8.10 大小寫錯誤
C 程式對代碼的大小寫是敏感的,不同的大小寫代表不同的內容。例如下面的代碼,將
小寫的“int”錯誤的寫成了“Int”。
Int t;
程式顯示的錯誤資訊如下所示,表明“Int”類型不存在或未聲明。發生這個錯誤時,會
輸出多行錯誤提示。
5.1.c:16: 錯誤:‘Int’ 未聲明 (在此函數內第一次使用)
5.1.c:16: 錯誤:(即使在一個函數內多次出現,每個未聲明的識別字在其
5.1.c:16: 錯誤:所在的函數內只報告一次。)
5.1.c:16: 錯誤:expected ‘;’ before ‘t’
1.8.11 資料類型的錯誤
程式中的某些運算,必須針對相應的資料類型,否則這個運算會發生資料類型錯誤。例
如下面的代碼,錯誤地將兩個整型數進行求餘運算。
float a,b;
a= a %b ;
程式編譯時,輸出下面的錯誤,表明“%”運算符的運算元無效。
5.1.c:19: 錯誤:雙目運算符 % 運算元無效
1.8.12 賦值類型錯誤
任何一個變數,在賦值時必須使用相同的資料類型。例如下面的代碼,錯誤地將一個字
符串賦值給一個字元。
char c;
c="a";
程式編譯時的結果如下所示,表明賦值時資料類型錯誤。
5.1.c:19: 警告:賦值時將指標賦給整數,未作類型轉換
1.8.13 迴圈或判斷語句中多加分號
分號在程式中的作用是表示一個語句結束。在程式的語句中用一個單獨的分號表示一個
空語句。但是在迴圈或判斷結構的後面,一個分號會導致程式的邏輯發生錯誤。關於這些結
構的使用方法,後面的章節將會詳細講到。下面的程式,在for 語句的後面,錯誤的添加了一
個分號,導致程式不能正常地進行迴圈。
#include
main()
{
int sum, j;
sum=0;
for(j=0;j<11;j++);
{
sum=sum+j;
}
printf(“%d”,sum);
}
這個程式的本意是要求出10 以內的整數和。但是在for 語句的後面,錯誤地使用了一個
分號。這時,程式不能正確地進行迴圈,而是把分號作為一個語句進行迴圈,所以程式輸出
的結果為“11”。
留言列表