c語言的最大特點是:功能強、使用方便靈活。c編譯的程式對語法檢查並不象其它高階語言那麼嚴格,這就給程式設計人員留下「靈活的餘地」,但還是由於這個靈活給程式的除錯帶來了許多不便,尤其對初學c語言的人來說,經常會出一些連自己都不知道錯在**的錯誤。看著有錯的程式,不知該如何改起,本人通過對c的學習,積累了一些c程式設計時常犯的錯誤,寫給各位學員以供參考。
1.書寫識別符號時,忽略了大小寫字母的區別。
main()
編譯程式把a和a認為是兩個不同的變數名,而顯示出錯資訊。c認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常量名用大寫,變數名用小寫表示,以增加可讀性。
2.忽略了變數的型別,進行了不合法的運算。
main()
%是求餘運算,得到a/b的整餘數。整型變數a和b可以進行求餘運算,而實型變數則不允許進行「求餘」運算。
3.將字元常量與字串常量混淆。
char c;
c="a";
在這裡就混淆了字元常量與字串常量,字元常量是由一對單引號括起來的單個字元,字串常量是一對雙引號括起來的字串行。c規定以「\」作字串結束標誌,它是由系統自動加上的,所以字串「a」實際上包含兩個字元:『a'和『\',而把它賦給乙個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在許多高階語言中,用「=」符號作為關係運算子「等於」。如在basic程式中可以寫
if (a=3) then …
但c語言中,「=」是賦值運算子,「==」是關係運算子。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是c語句中不可缺少的一部分,語句末尾必須有分號。
a=1b=2
編譯時,編譯程式在「a=1」後面沒發現分號,就把下一行「b=2」也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
對於復合語句來說,最後乙個語句中最後的分號不能忽略不寫(這是和pascal不同的)。
6.多加分號。
對於乙個復合語句,如:
;復合語句的花括號後不應再加分號,否則將會畫蛇添足。
又如:if (a%3==0);
i++;
本是如果3整除a,則i加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程式將執行i++語句,不論3是否整除a,i都將自動加1。
再如:for (i=0;i<5;i++);
本意是先後輸入5個數,每輸入乙個數後再將它輸出。由於for()後多加了乙個分號,使迴圈體變為空語句,此時只能輸入乙個數並輸出它。
7.輸入變數時忘記加位址運算子「&」。
int a,b;
scanf("%d%d",a,b);
這是不合法的。scanf函式的作用是:按照a、b在記憶體的位址將a、b的值存進去。「&a」指a在記憶體中的位址。
8.輸入資料的方式與要求不符。①scanf("%d%d",&a,&b);
輸入時,不能用逗號作兩個資料間的分隔符,如下面輸入不合法:
3,4
輸入資料時,在兩個資料之間以乙個或多個空格間隔,也可用回車鍵,跳格鍵tab。
②scanf("%d,%d",&a,&b);
c規定:如果在「格式控制」字串中除了格式說明以外還有其它字元,則在輸入資料時應輸入與這些字元相同的字元。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字元是不對的。
3 4 3:4
又如:scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4
9.輸入字元的格式與要求不一致。
在用「%c」格式輸入字元時,「空格字元」和「轉義字元」都作為有效字元輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c
字元「a」送給c1,字元「 」送給c2,字元「b」送給c3,因為%c只要求讀入乙個字元,後面不需要用空格作為兩個字元的間隔。
10.輸入輸出的資料型別與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf("%f%d\n",a,b);
編譯時不給出出錯資訊,但執行結果將與原意不符。這種錯誤尤其需要注意。
11.輸入資料時,企圖規定精度。
scanf("%7.2f",&a);
這樣做是不合法的,輸入資料時不能規定精度。
12.switch語句中漏寫break語句。
例如:根據考試成績的等級列印出百分制數段。
switch(grade)
printf("%d",a);
}(2)main()
while(i<=10);
printf("%d",a);
}可以看到,當輸入i的值小於或等於10時,二者得到的結果相同。而當i>10時,二者結果就不同了。因為while迴圈是先判斷後執行,而do-while迴圈是先執行後判斷。對於大於10的數while迴圈一次也不執行迴圈體,而do-while語句則要執行一次迴圈體。
14.定義陣列時誤用變數。
int n;
scanf("%d",&n);
int a[n];
陣列名後用方括號括起來的是常量表示式,可以包括常量和符號常量。即c不允許對陣列的大小作動態定義。
15.在定義陣列時,將定義的「元素個數」誤認為是可使的最大下標值。
main()
;printf("%d",a[10]);
}c語言規定:定義時用a[10],表示a陣列有10個元素。其下標值由0開始,所以陣列元素a[10]是不存在的。
16.初始化陣列時,未使用靜態儲存。
int a[3]=;
這樣初始化陣列是不對的。c語言規定只有靜態儲存(static)陣列和外部儲存(exterm)陣列才能初始化。應改為:
static int a[3]=;這條都說不對額。。。其實都一樣啦,現在都是預設靜態儲存了。
17.在不應加位址運算子&的位置加了位址運算子。
scanf("%s",&str);
c語言編譯系統對陣列名的處理是:陣列名代表該陣列的起始位址,且scanf函式中的輸入項是字元陣列名,不必要再加位址符&。應改為:
scanf("%s",str);
18.同時定義了形參和函式中的區域性變數。
int max(x,y)
int x,y,z;
形參應該在函式體外定義,而區域性變數應該在函式體內定義。應改為:
int max(x,y)
int x,y;
c語言中,易錯知識點
1.結構體的計算 struct bbb p sizeof struct bbb 16 int main 2.結構體中結構體,共用體中結構體的大小 union aaahalf short kk number struct bbbhalf struct tagccc half long kk 結構體是個...
c語言 出錯處理errno
include void perror const char msg 1.errno變數 檔案 中定義了符號 errno 以及可以賦予它的各種常量,這些常量都是以字元 e 開頭。例如,若 errno 等於常量 eacces,表示產生了許可權問題 例如,沒有開啟所要求檔案的足夠許可權 errno特點 ...
C語言中的 ,
c語言中的 今天在分析乙份原始碼的時候遇到了如下 define uf call x report file line x,x static int report char file,int line,char call,int irc return irc 網上參考 cpp view plain c...