更新時間:2018-01-24 來源:黑馬程序員 瀏覽量:
在初學者學習編程的過程中的會遇到一些經常會犯的錯誤,也許在我們成長起來之后會覺得這些錯誤實在太低級,但是在牛掰的大蝦也是從菜鳥過來的,針對于初學者下邊總結了一些我們會經常遇到的陷阱,希望對菜鳥們有幫助:
正題:
陷阱1:忽略大小寫的區別
#include
void main()
{
int a=10;
a+=a;
printf("%d\n",A);
}
這個很簡單,是基礎,c語言變量區分大小寫。代碼中的a與A不是同個變量,編譯出現A沒定義的錯誤。
陷阱2:“{}”與“()”使用不當造成錯誤
#include
void main()
{
int i,j;
int a[2][3]={(1,2,3),(4,5,6)};
printf("array a:\n");
for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
}
程序結果不能正常輸出數組每個元素,編譯{(1,2,3),(4,5,6)};時,先進行括號內的逗號運算(取逗號最后的數值),編譯生成{3,6};其它元素為0。正確的寫法:{{1,2,3},{4,5,6}};
陷阱3:在if,while,#include,#define,for后直接加分號,如for(int a=1;a<10;a++);
如果是while,程序一般執行死循環,int a=1;while(a);
如果是if,判斷語句無效果,比如。if(a>0);a=-1;無論a是否大于0,結果都是a=-1;
如果是#include,程序編譯的時候提示錯誤,無法引用庫文件;
如果是#define,比如#define a 200;程序在預編譯的時候,200;包括分號一同被替換進程序,程序不可能正常編譯
如果是for循環,跟if一樣,事與愿違,循環做無用功,本想循環的printf語句只執行一次。for(int a=1;a<10;a++);printf("%d",a);程序只輸出一次a值。
陷阱4:使用循環語句不慎產生死循環
#include
void main()
{
unsigned int i;
for(i=10;i>=0;i--)
printf("%d",i);
printf("\n");
}
i被定義為無符號整型變量,i的值永遠大于等于0;i>=0永遠成立;
陷阱5:do....while與while之間的區別
do....while先執行再判斷條件是否成立;無論條件是否成立,do....while至少執行一次;
while 先判斷,再執行;條件不成立,就不執行,可能執行0次;
陷阱6:數據溢出產生的錯誤
#include
void main()
{
int i,rst;
i=32767;//這里是turbo c中int類型為16位,c++為32位
rst=i+1;
printf("%d,%d",i,rst);
}
c語言中int占兩個字節,數據最大支持補碼正數值32767,加1溢出。
陷阱7:除號/用法導致的錯誤
如果除號的兩邊都為整數,結果為整數;兩邊有一個實數,結果為實數;
#include
void main()
{
double i;
i=9.5+1/2;
printf("%f",i);
}
結果輸出9.500000;這里的1/2運算符兩邊為整數,1/2=0;正確的輸出:i=9.5+1.0/2;
陷阱8:變量未定義
雖說是人人都清楚的問題,但是還是會出現。
陷阱9:用scanf輸入數據時忘記加&符號
#include
void main()
{
int a,b;
printf("輸入兩個整數\n");
scanf("%d%d",a,b);
printf("%d%d\n",a,b);
}
scanf第二個參數必須為地址。正確的寫法:scanf("%d%d",&a,&b);
陷阱10:使用scanf函數輸入格式不符
#include
void main()
{
int a,b;
scanf("%d,%d",&a,&b);
printf("%d,%d",a,b);
}
凡是學c語言都遇到過這問題,錯在輸入a和b時,忘了在ab之間輸入逗號。
不是任何的場合適合用其他符號用作數據輸入分割。比如scanf(“%s,%d,%s”,&a,&b,&c);a得到的是整個語句的內容。
我提議用空格取代其他符號分隔數據,可以減少不必要的錯誤。
陷阱11:輸入的數據類型不符的陷阱
比如在上代碼程序輸入字符'a','b'.輸出不是想要的結果。改成scanf("%c%c",&a,&b),輸入字符用%c。
陷阱12:switch語句中忘記使用break;
#include
void main()
{
char grade;
scanf("%c",&grade);
switch(grade)
{
case 'a':printf("90-100\n");
case 'a':printf("80-100\n");
}
switch中忘記用break;則每種情況都判斷,滿足條件都執行
}
陷阱13:指針沒被初始化
指針是存放地址的變量,與其他變量相同的是,變量未被賦值時,變量存放著內存上原本的值(內存的釋放與文件的刪除相類似,內存上的數據不改動,除非其他數據覆蓋上去),變量的賦值就是數據的覆蓋,內存上保存了上次運行的數據。未被賦值的指針,不知指向哪里。
#include
#include
#include
using namespace std;
int main()
{
char*str;
strcpy(str,"good");
printf("%s",str);
retrun 0;
}
代碼中的str指針未被賦值而使用,程序無法編譯。
陷阱14:超出動態分配的內存
#include
#include
#include
using namespace std;
int main()
{
char*str=malloc(5);
strcpy(str,"goodluck");
printf("%s",str);
free(str);
retrun 0;
}
程序動態分配5字節的內存空間,但是賦值超過了5字符,錯誤為賦值的數據超過動態分配的空間。
陷阱15:使用內存后未釋放
#include
#include
#include
using namespace std;
int main()
{
char*str=malloc(20);
strcpy(str,"goodluck");
printf("%s",str);
retrun 0;
}
有必要在這里說說動態內存怎么釋放:
內存未釋放在程序運行時,開始不出現錯誤,過多占用內存時會造成內存空間不足而死機的現象。
本文版權歸黑馬程序員C/C++學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:黑馬程序員C/C++培訓學院