全國咨詢/投訴熱線:400-618-4000

C/C++:初學者常遇到的c語言陷阱

更新時間:2018年01月24日14時30分 來源:傳智播客 瀏覽次數:

在初學者學習編程的過程中的會遇到一些經常會犯的錯誤,也許在我們成長起來之后會覺得這些錯誤實在太低級,但是在牛掰的大蝦也是從菜鳥過來的,針對于初學者下邊總結了一些我們會經常遇到的陷阱,希望對菜鳥們有幫助:

正題:

陷阱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++學院
首發:http://www.lahirul.com/c/
人妻系列无码专区_漂亮人妻被中出中文字幕_人妻中文制服巨乳中文