當前位置:編程學習大全網 - 編程語言 - c語言中的錯誤

c語言中的錯誤

C語言常見錯誤總結

C語言最大的特點是:功能強大,使用方便靈活。C編譯的程序在語法檢查上沒有其他高級語言那麽嚴格,這就給程序員留下了“靈活的余地”,但是這種靈活性給程序的調試帶來了很多不便,尤其是對於C語言的初學者來說,經常會犯壹些連自己都不知道錯在哪裏的錯誤。看著程序不對,不知道怎麽改。通過對C的學習,我積累了壹些C編程常犯的錯誤,寫出來供大家參考。

1.在編寫標識符時,大寫字母和小寫字母之間的差異被忽略了。main(){ int a = 5;

printf("%d ",A);}編譯器將A和A視為兩個不同的變量名,並顯示壹條錯誤消息。c認為大寫字母

和小寫字母是兩種不同的字符。傳統上,符號常量名稱大寫,變量名小寫,以增加可讀性。

2.忽略變量的類型並執行非法操作。main(){float a,b;printf("%d ",a % b);}%是余數運算,得到a/b的整數余數。整型變量A和B可以進行余數運算,而實型變量不允許進行“余數”運算。

3.混淆字符常量和字符串常量。char c;c = " a這裏,字符常量與字符串常量混淆了。字符常量是用壹對單引號括起來的單個字符,字符串常量是用壹對雙引號括起來的字符序列。c指定“\”作為字符串的結尾,這是系統自動添加的,所以字符串“a”實際上包含了兩個字符:‘a’和’\’,將其賦給字符變量是不可以的。

4.忽略“=”和“= =”的區別。在許多高級語言中,符號“=”被用作關系運算符“等於”。如同在基本程序中壹樣

可以寫if (a=3) then …但是在C語言中,“=”是賦值運算符,“= =”是關系運算符。例如,如果(a = = 3)a = b;前者是比較A是否等於3,後者是指如果A和3相等,給A賦值B值..因為習慣,初學者經常會犯這樣的錯誤。

5.別管加號了。分號是C語句不可或缺的壹部分,語句末尾必須有分號。編譯a=1b=2時,編譯器沒有找到“a=1”後面的分號,所以把下壹行“b=2”作為上壹行的壹部分,這樣會導致語法錯誤。改錯的時候,有時候被指出錯誤的那壹行並沒有發現錯誤,就要看前面壹行的分號是不是漏了。{ z = x+y;t = z/100;printf("%f ",t);}對於復合語句,不能忽略最後壹個語句中的最後壹個分號(這和PASCAL不同)。

6.加分。對於復合語句,比如:{ z = x+y;t = z/100;printf("%f ",t);};復合句的大括號後面不能有多余的符號,否則會畫蛇添足。再比如:if(a % 3 = = 0);i++;本來如果3被A整除,我會加1。但由於if後面加了分號(a%3==0),if語句到此結束,程序會執行I++語句,不管3是否能被A整除,我都會自動加1。再比如:for(I = 0;我& lt5;i++);{scanf("%d ",& ampx);printf("%d ",x);}原意是依次輸入五個數字,然後輸出每個數字。因為在for()後面添加了分號,所以循環體變成了壹個空語句。此時,只能輸入和輸出壹個數字。

7.輸入變量時忘記添加地址運算符“&”。。int a,b;scanf("%d%d ",a,b);

這是違法的。Scanf函數用於根據A和B在內存中的地址來存儲它們的值。“& amp“A”是指內存中A的地址。

8.數據輸入方式不符合要求。①scanf("%d%d ",& amp壹,& ampb);輸入時,不能用逗號作為兩個數據之間的分隔符,如以下輸入是非法的:3,4?輸入數據時,在兩個數據之間留出壹個或多個空格,或者按Enter或tab。②scanf("%d,%d ",& amp壹,& ampb);c規定,如果“格式控制”字符串中有格式描述以外的其他字符,則在輸入數據時應輸入與這些字符相同的字符。以下輸入是合法的:3,4?這時候用空格或其他字符代替逗號是錯誤的。3 4?3:4?再比如:scanf ("A =% d,B =% d ",&;壹,& ampb);輸入應該是以下形式:a=3,b=4?

9.輸入字符的格式不符合要求。當輸入“%c”格式的字符時,“空格字符”和“轉義字符”都作為有效字符輸入。scanf("%c%c%c ",& ampc 1;c2和ampC3);如果妳輸入壹個b c?字符“a”發送到c1,字符“”發送到c2,字符“b”發送到c3,因為%c只需要讀壹個字符,不需要用空格作為兩個字符之間的間隔。

10.輸入和輸出的數據類型與使用的格式說明符不壹致。比如A已經定義為整數,B定義為實型A = 3;b = 4.5printf("%f%d\n ",a,b);編譯時不會給出錯誤信息,但運行結果會與初衷不符。這種錯誤需要特別註意。

11.在輸入數據時,曾試圖規定準確性。scanf("%7.2f ",& ampa);這樣做是違法的,輸入數據時無法指定精度。

12.switch語句中省略了break語句。比如根據考試成績的等級打印出壹個百分比數字段。switch(grade){ case ' A ':printf(" 85 ~ 100 \ n ");情況' B ':printf(" 70 ~ 84 \ n ");case ' C ':printf(" 60 ~ 69 \ n ");case ' D ':printf(" & lt;60 \ n”);默認值:printf(" error \ n ");由於break語句的省略,case只起到標簽的作用,不起到判斷的作用。因此,當等級值為a時,printf函數在執行第壹條語句後,執行第二、第三、第四、第五條printf函數語句。正確的寫法應該加上“break”在每個分支之後。。比如case ' A ':printf(" 85 ~ 100 \ n ");打破;

13.忽略while和do-while語句之間的細節差異。(1)main(){int a=0,I;scanf("%d ",& ampI);while(我& lt= 10){ a = a+I;i++;}printf("%d ",a);}(2)main(){int a=0,I;scanf("%d ",& ampI);do { a = a+I;i++;} while(I & lt;=10);printf("%d ",a);}可以看出,當輸入I的值小於等於10時,兩者得到的結果是壹樣的。當我& gt在10,結果就不壹樣了。因為while循環是在執行前判斷的,而do-while循環是在執行後判斷的。對於大於10的數字,while循環不執行壹次循環體,而do-while語句執行壹次循環體。

14.定義數組時誤用變量。int n;

scanf("%d ",& ampn);int a[n];數組名兩邊的方括號是常量表達式,可以包含常量和符號常量。也就是說,C不允許動態定義數組的大小。

15.定義數組時,定義的“元素數”被誤認為是最大下標值。main(){ static int a[10]= { 1,2,3,4,5,6,7,8,9,10 };printf("%d ",a[10]);c語言規定定義的時候用a[10],也就是說數組A有10個元素。它的下標值從0開始,所以數組元素a[10]不存在。

16.初始化陣列時未使用靜態存儲。int a[3]={0,1,2 };像這樣初始化數組是錯誤的。c語言規定只能初始化靜態存儲數組和外部存儲數組。應該改成:static int a[3]={0,1,2 };17.不應添加地址運算符&;地址運算符被添加到的位置。

scanf("%s ",& ampstr);C語言編譯系統對數組名的處理是這樣的:數組名代表數組的起始地址,scanf函數中的輸入項是字符數組名,所以不需要加地址符號&。應該改成:scanf("%s ",str);18.同時定義了形式參數和函數中的局部變量。int max(x,y)int x,y,z;{ z = x & gty?x:y;返回(z);形參應該在函數外部定義,而局部變量應該在函數內部定義。應該改成:int max(x,y)int x,y;{ int z;z = x & gty?x:y;返回(z);}

  • 上一篇:線程編程
  • 下一篇:面對行業大調整,更多的教培老師們如今在幹嘛?
  • copyright 2024編程學習大全網