當(dāng)前位置:首頁>>開發(fā)編程>>綜合開發(fā)>>新聞內(nèi)容
C語言初學(xué)者的十八顆“地雷”
作者:何軍 發(fā)布時(shí)間:2004-7-17 10:16:20 文章來源:水木清華

  icech注:這些“地雷”是針對(duì)初初學(xué)者的,大都是一些非常簡單的錯(cuò)誤,不過還是可以看看的。

  C語言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ法檢查并不象其它高級(jí)語言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來了許多不便,尤其對(duì)初學(xué)C語言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤?粗绣e(cuò)的程序,不知該如何改起,本人通過對(duì)C的學(xué)習(xí),積累了一些C編程時(shí)常犯的錯(cuò)誤,寫給各位學(xué)員以供參考。

  1.書寫標(biāo)識(shí)符時(shí),忽略了大小寫字母的區(qū)別。

main()
{
 int a=5;
 printf("%d",A);
}


  編譯程序把a(bǔ)和A認(rèn)為是兩個(gè)不同的變量名,而顯示出錯(cuò)信息。C認(rèn)為大寫字母和小寫字母是兩個(gè)不同的字符。習(xí)慣上,符號(hào)常量名用大寫,變量名用小寫表示,以增加可讀性。

  2.忽略了變量的類型,進(jìn)行了不合法的運(yùn)算。

main()
{
 float a,b;
 printf("%d",a%b);
}


  %是求余運(yùn)算,得到a/b的整余數(shù)。整型變量a和b可以進(jìn)行求余運(yùn)算,而實(shí)型變量則不允許進(jìn)行“求余”運(yùn)算。

  3.將字符常量與字符串常量混淆。

char c;
c="a";


  在這里就混淆了字符常量與字符串常量,字符常量是由一對(duì)單引號(hào)括起來的單個(gè)字符,字符串常量是一對(duì)雙引號(hào)括起來的字符序列。C規(guī)定以“\”作字符串結(jié)束標(biāo)志,它是由系統(tǒng)自動(dòng)加上的,所以字符串“a”實(shí)際上包含兩個(gè)字符:‘a(chǎn)'和‘\',而把它賦給一個(gè)字符變量是不行的。

  4.忽略了“=”與“==”的區(qū)別。

  在許多高級(jí)語言中,用“=”符號(hào)作為關(guān)系運(yùn)算符“等于”。如在BASIC程序中可以寫

if (a=3) then …


  但C語言中,“=”是賦值運(yùn)算符,“==”是關(guān)系運(yùn)算符。如:

if (a==3) a=b;


  前者是進(jìn)行比較,a是否和3相等,后者表示如果a和3相等,把b值賦給a。由于習(xí)慣問題,初學(xué)者往往會(huì)犯這樣的錯(cuò)誤。

  5.忘記加分號(hào)。

  分號(hào)是C語句中不可缺少的一部分,語句末尾必須有分號(hào)。

a=1
b=2


  編譯時(shí),編譯程序在“a=1”后面沒發(fā)現(xiàn)分號(hào),就把下一行“b=2”也作為上一行語句的一部分,這就會(huì)出現(xiàn)語法錯(cuò)誤。改錯(cuò)時(shí),有時(shí)在被指出有錯(cuò)的一行中未發(fā)現(xiàn)錯(cuò)誤,就需要看一下上一行是否漏掉了分號(hào)。

{
 z=x+y;
 t=z/100;
 printf("%f",t);
}


  對(duì)于復(fù)合語句來說,最后一個(gè)語句中最后的分號(hào)不能忽略不寫(這是和PASCAL不同的)。

  6.多加分號(hào)。

  對(duì)于一個(gè)復(fù)合語句,如:

{
 z=x+y;
 t=z/100;
 printf("%f",t);
};


  復(fù)合語句的花括號(hào)后不應(yīng)再加分號(hào),否則將會(huì)畫蛇添足。

  又如:

if (a%3==0);
I++;


  本是如果3整除a,則I加1。但由于if (a%3==0)后多加了分號(hào),則if語句到此結(jié)束,程序?qū)?zhí)行I++語句,不論3是否整除a,I都將自動(dòng)加1。

  再如:

for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}


  本意是先后輸入5個(gè)數(shù),每輸入一個(gè)數(shù)后再將它輸出。由于for()后多加了一個(gè)分號(hào),使循環(huán)體變?yōu)榭照Z句,此時(shí)只能輸入一個(gè)數(shù)并輸出它。

  7.輸入變量時(shí)忘記加地址運(yùn)算符“&”。

int a,b;
scanf("%d%d",a,b);


  這是不合法的。Scanf函數(shù)的作用是:按照a、b在內(nèi)存的地址將a、b的值存進(jìn)去。“&a”指a在內(nèi)存中的地址。

  8.輸入數(shù)據(jù)的方式與要求不符。

 、賡canf("%d%d",&a,&b);

  輸入時(shí),不能用逗號(hào)作兩個(gè)數(shù)據(jù)間的分隔符,如下面輸入不合法:

3,4

  輸入數(shù)據(jù)時(shí),在兩個(gè)數(shù)據(jù)之間以一個(gè)或多個(gè)空格間隔,也可用回車鍵,跳格鍵tab。

 、趕canf("%d,%d",&a,&b);

  C規(guī)定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數(shù)據(jù)時(shí)應(yīng)輸入與這些字符相同的字符。下面輸入是合法的:

3,4

  此時(shí)不用逗號(hào)而用空格或其它字符是不對(duì)的。

3 4 3:4

  又如:

scanf("a=%d,b=%d",&a,&b);


  輸入應(yīng)如以下形式:

a=3,b=4

  9.輸入字符的格式與要求不一致。

  在用“%c”格式輸入字符時(shí),“空格字符”和“轉(zhuǎn)義字符”都作為有效字符輸入。

scanf("%c%c%c",&c1,&c2,&c3);

  如輸入a b c

  字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因?yàn)?c只要求讀入一個(gè)字符,后面不需要用空格作為兩個(gè)字符的間隔。

  10.輸入輸出的數(shù)據(jù)類型與所用格式說明符不一致。

  例如,a已定義為整型,b定義為實(shí)型

a=3;b=4.5;
printf("%f%d\n",a,b);


  編譯時(shí)不給出出錯(cuò)信息,但運(yùn)行結(jié)果將與原意不符。這種錯(cuò)誤尤其需要注意。

  11.輸入數(shù)據(jù)時(shí),企圖規(guī)定精度。

scanf("%7.2f",&a);


  這樣做是不合法的,輸入數(shù)據(jù)時(shí)不能規(guī)定精度。
  
  12.switch語句中漏寫break語句。

  例如:根據(jù)考試成績的等級(jí)打印出百分制數(shù)段。

switch(grade)
{
 case 'A':printf("85~100\n");
 case 'B':printf("70~84\n");
 case 'C':printf("60~69\n");
 case 'D':printf("<60\n");
 default:printf("error\n");
}


  由于漏寫了break語句,case只起標(biāo)號(hào)的作用,而不起判斷作用。因此,當(dāng)grade值為A時(shí),printf函數(shù)在執(zhí)行完第一個(gè)語句后接著執(zhí)行第二、三、四、五個(gè)printf函數(shù)語句。正確寫法應(yīng)在每個(gè)分支后再加上“break;”。例如

case 'A':printf("85~100\n");break;


  13.忽視了while和do-while語句在細(xì)節(jié)上的區(qū)別。

  (1)main()

{int a=0,I;
scanf("%d",&I);
while(I<=10)
{a=a+I;
I++;
}
printf("%d",a);
}


  (2)

main()

{int a=0,I;
scanf("%d",&I);
do
{a=a+I;
I++;
}while(I<=10);
printf("%d",a);
}


  可以看到,當(dāng)輸入I的值小于或等于10時(shí),二者得到的結(jié)果相同。而當(dāng)I>10時(shí),二者結(jié)果就不同了。因?yàn)閣hile循環(huán)是先判斷后執(zhí)行,而do-while循環(huán)是先執(zhí)行后判斷。對(duì)于大于10的數(shù)while循環(huán)一次也不執(zhí)行循環(huán)體,而do-while語句則要執(zhí)行一次循環(huán)體。

  14.定義數(shù)組時(shí)誤用變量。

int n;
scanf("%d",&n);
int a[n];


  數(shù)組名后用方括號(hào)括起來的是常量表達(dá)式,可以包括常量和符號(hào)常量。即C不允許對(duì)數(shù)組的大小作動(dòng)態(tài)定義。

  15.在定義數(shù)組時(shí),將定義的“元素個(gè)數(shù)”誤認(rèn)為是可使的最大下標(biāo)值。

main()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}

  C語言規(guī)定:定義時(shí)用a[10],表示a數(shù)組有10個(gè)元素。其下標(biāo)值由0開始,所以數(shù)組元素a[10]是不存在的。

  16.初始化數(shù)組時(shí),未使用靜態(tài)存儲(chǔ)。

int a[3]={0,1,2};

  這樣初始化數(shù)組是不對(duì)的。C語言規(guī)定只有靜態(tài)存儲(chǔ)(static)數(shù)組和外部存儲(chǔ)(exterm)數(shù)組才能初始化。應(yīng)改為:

static int a[3]={0,1,2};

  17.在不應(yīng)加地址運(yùn)算符&的位置加了地址運(yùn)算符。

scanf("%s",&str);

  C語言編譯系統(tǒng)對(duì)數(shù)組名的處理是:數(shù)組名代表該數(shù)組的起始地址,且scanf函數(shù)中的輸入項(xiàng)是字符數(shù)組名,不必要再加地址符&。應(yīng)改為:

scanf("%s",str);

  18.同時(shí)定義了形參和函數(shù)中的局部變量。

int max(x,y)
int x,y,z;
{
 z=x>y?x:y;
 return(z);
}

  形參應(yīng)該在函數(shù)體外定義,而局部變量應(yīng)該在函數(shù)體內(nèi)定義。應(yīng)改為:

int max(x,y)
int x,y;
{
 int z;
 z=x>y?x:y;
 return(z);
}


最新更新
·wml中頁面自動(dòng)跳轉(zhuǎn)的實(shí)現(xiàn)方法
·Alexa排名數(shù)據(jù)接口的簡要介紹
·利用U盤進(jìn)行軟件加密的方法(VB)
·優(yōu)秀程序員的十個(gè)習(xí)慣
·項(xiàng)目管理:如何逃離垃圾客戶
·QQ2009去廣告部分核心源代碼
·讓程序更容易理解:13個(gè)代碼注釋的小技
·nx1和nx2后綴名是什么數(shù)據(jù)庫文件?
·正則表達(dá)式符號(hào)解釋大全
·什么是RIA?介紹幾種RIA客戶端開發(fā)技術(shù)
相關(guān)信息
·一個(gè) Cobol 程序員的告白
·在Visual C#程序中使用系統(tǒng)熱鍵
·利用Apache實(shí)現(xiàn)禁止圖片盜鏈
·C++中對(duì)浮點(diǎn)數(shù)的格式化顯示
·C語言中實(shí)現(xiàn)動(dòng)態(tài)分配二維數(shù)組
·C語言之可變參數(shù)問題
·Visual C++實(shí)現(xiàn)各種文字特殊效果
·C++/CLI解析之基于堆棧的對(duì)象與跟蹤引用
·利用C#實(shí)現(xiàn)標(biāo)注式消息提示窗口
·實(shí)例解析C++/CLI之值類型
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯(cuò)
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時(shí)代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實(shí)很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個(gè)傳說
丟了幸福的豬
找個(gè)人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因?yàn)榧拍畔肽?/a>
愛上你等于愛上了錯(cuò)
在心里從此永遠(yuǎn)有個(gè)你
一個(gè)人的寂寞兩個(gè)人的錯(cuò)