进来,让BUG远离你!
筆者從開始學習C語言到現在,經歷過大大小小的BUG不計其數,今天就來給大家分享幾種常見的BUG.
?
(1)書寫標識符時,忽略大小寫
main()
{
? ? int c=5;
? ? printf("%d",C);
}
編譯程序會出錯。C語言區分大小寫。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。
(2)忽略變量類型,進行不合法運算
main()
{
? ? float a,b;
? ? printf("%d",a%b);
}
%是求余運算,得到a/b的整余數。整型變量可進行求余運算,而實型變量則不允許進行求余運算。
(3)將字符常量與字符串常量混淆
char a;
a="b";
字符常量是一對單引號括起來的常量,字符串常量是一對雙引號括起來的常量。C語言規定以“\0”作為字符串結束標志,它是系統自動加上的,所以字符常量“b”其實包含兩個字符'b' '\0',而把它賦給一個字符變量是不行的。
(4)忽略了“=”和“==”的區別
if(a==b)a=b;
C語言中,“=”是賦值運算符,“==”是關系運算符。在此代碼中,前者是進行比較,后者是進行賦值。
(5)忘記加分號
c=1
b=2
幾乎在所有編程語言中,都是用“;”代表一句或多句語句的結束。
(6)多加分號
{
? ? z=x/y;
? ? z=z%10;
? ? printf("%d",z);
};
if(a%2==0);
a+=a;
for(i=0;i<5;++i);
{
? ? a-=a;
? ? printf("%d",a);
}
(7)忘加地址運算符“&”
int a;
scanf("%d",a);
scanf函數的作用是:按照a在內存中的地址將a的值存進去?!?amp;a”是指a在內存中的地址。
(8)輸入數據的方式與要求不符
scanf("%a%b",&a,&b);
輸入時不能用“,”將a,b隔開如:3,4;應該用空格
scanf("%a,%b",&a,&b);
此時應輸入a,b 才是正確的
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。正確形式應輸入:abc
(10)輸入、輸出的數據類型與所用格式說明符不一致
int a=1;
float b=1.2;
printf("%f%d",a,b);
這種錯誤要引起重視,編譯器不會出現錯誤,但運行結果錯誤。
(11)輸入數據時,規定精度
scanf("%6.2lf",&a);
輸入數據時不能規定精度。
(12)switch語句中漏寫break語句
switch(grade)
{
? ? case 'A':printf("90-100\n");
? ? case 'B':printf("75-89\n");
? ? case 'C':printf("60-74\n");
? ? case 'D':printf("<60\n");
? ? default:printf("put in error\n");
}
由于漏寫了break語句,case只起標識的作用,而不起判斷的作用。當grade的值為A時,程序會從上到下執行完,五個printf都輸出。正確的寫法應為:
switch(grade)
{
? ? case 'A':printf("90-100\n");break;
? ? case 'B':printf("75-89\n");break;
? ? case 'C':printf("60-74\n");break;
? ? case 'D':printf("<60\n");break;
? ? default:printf("put in error\n");break;
}
(13)忽視while和do-while語句區別
while語句
main()
{
? ? int a=0,i;
? ? scanf("%d",&i);
? ? while(i<=10)
? ? {
? ? ? ? a+=i;
? ? ? ? ++i;
? ? }
? ? printf("%d",a);
}
do-while語句
main()
{
? ? int a=0,i;
? ? scanf("%d",&i);
? ? do
? ? {
? ? ? ? a+=i;
? ? ? ? ++i;
? ? }while(i<=10);
? ? printf("%d",a);
}
當輸入的i值小于等于10時,兩者輸出結果無區別。當輸入的i大于10時,while語句不執行循環體,do-while語句執行一次循環題。因為while語句先判斷后執行,do-while語句先執行后判斷。
(14)忽略自增(自減)運算符的細節
第一個區別, i++ 返回原來的值,++i 返回加1后的值
main()
{
? ? int a=0,b=0,i;
? ? scanf("%d",&i);
? ? a=++i;
? ? --i;//保證i值沒變化
? ? b=i++;
? ? print("a=%d,b=%d",a,b);
}
輸出結果: a=i+1 b=i 。因為a=++i;是先把i加1再賦值給a,可以把此句分解為:i=i+1;a=i;;b=i++; 是先把i賦值給b再加1,可分解為:b=i;i=i+1; 。
第二個區別,i++ 不能作為左值,而++i 可以
左值是對應內存中有確定存儲地址的對象的表達式的值,而右值是所有不是左值的表達式的值。
int i = 1;
int *p1 = &(++i); //正確
int *p2 = &(i++); //錯誤
++i = 6; //正確
i++ = 8; //錯誤
(15)忽略sizeof()和strlen()的區別
char str[20]="Incredibly";
int? a=strlen(str); /* a=10;strlen 計算字符串的長度,以\0'為字符串結束標記。 */
int? b=sizeof(str); /* b=20;sizeof 計算的則是分配的數組str[20] 所占的內存空間的大小,不受里面存儲的內容影響*/
(16)在定義數組時,將定義的“元素個數”誤認為是可使用的最大下標
main()
{
? ? int a[5]={0,1,2,3,4};
? ? printf("%d",a[5]);
}
C語言中,定義時用a[5],表示a數組中有5個元素。其下標是從0開始的,數組中最后一個元素是a[4],不存在a[5]。
(17)定義數組時誤用變量
int i;
scanf("%d",#i);
int a[i];//錯
數組名后用方括號括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組大小作動態定義。
(18)地址運算符&使用錯誤
char str[8];
scanf("%s",&str);//錯
C中,數組名代表地址。正確的應為:
char str[8];
scanf("%s",str);
(19)同時定義了形參和函數中的局部變量
int x,y,z;
int max(x,y)
{
? ? z=x>y?x:y;
? ? return z;
}
形參應在函數體外定義,而局部變量應在函數體內定義。正確的應為:
int x,y;
int max(x,y)
{
? ? int z;
? ? z=x>y?x:y;
? ? return z;
}
大家還有哪些常見的易錯點呢,歡迎留言。另外,你如果感覺自學C/C++語言有困難的話,我本身是一個C/C++出身的程序員,我整理了一些學習C語言的視頻在扣裙,大家有興趣可以一起來學習,893,154,,226。
總結
以上是生活随笔為你收集整理的进来,让BUG远离你!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字化赋能智能生产,一套数据决策分析体系
- 下一篇: IMP-00041: 警告: 创建的对象