等級考試(筆試)雖然知識面比較廣,但不是很深,基礎部分考的是你日常操作的能力,程式設計多數是考你的細心。辛辛苦苦準備了大半年,又經過2個小時的考場之戰,交卷之後還很“自美”,成績單上的“不及格”讓你一時不敢相信自己的眼睛。
當對著答案細細“品味”時,你會n次的感嘆……原來“罪魁禍首”是“不細心”。
綜觀這四年來的考題,對容易出錯的典型題例作了匯總和分析,也好給以後參加二級c考試的朋友增加點免疫力吧。本文將分三次刊登。
第一類,審題不清
1.審題時的一字之差。
一定要搞清題意,題目讓我們選擇的是“正確”還是“不正確”的;“能”還是“不能”的;本來要求選出一個錯誤的答案,但題目中沒有“錯誤”字樣,而是說 “……請選出不正確的一項”,一不小心你就可能會把選項中最前面一個“正確”的選為答案,因“正確”的有三個選項,當然覺得很容易,就這樣,“錯誤”輕易地從你的筆尖溜走了。
2.不注意文字部分的要求和說明。
很多時候,為了省時間,上來就去看程式,這樣不僅不能省時間,還會走彎路、出錯誤。看看下面的兩個例子吧!
題例1:以下程式中函式f的功能是將n個字元串,按由大到小的順序進行排序。
#include
void f(char p[][10],int n)
{略}
main()
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i;
f(p,5); printf("%d\n",strlen(p[0])); }
程式運行後的輸出結果是
(a)6 (b)4 (c)5 (d)3
(為了節省版面,把函式f的內容略去了。)看過文字說明,接著看主函式,就可以鎖定這個字元串是“dcdbe”,而不用花時間去分析函式f。要注意的是:別把最長的一串當成最大的字元串噢,看上“aabdfg”可就錯了,答案應為c。
題例2: 以下程式中給指針p分配三個double型動態記憶體單元,請填空。
# include
main ( )
{ double 漰;
p=(double ) malloc(【 】);
p[0]=1.5;p[1]=2.5;p[2]=3.5;
printf("%f%f%f\n",p[0],p[1],p[2]);}
如果上來就看程式,就會忽略“給指針p分配三個double型動態記憶體單元”,這裡要求“三個”,如果大筆一揮寫出了sizeof(double)可就太冤枉了,其實應該是3漵izeof(double)。
第二類,把“賦值”
看成了“等於”
題例:有以下程式段
int k=0
while(k=1)k++;
while 循環執行的次數是:
(a)無限次 (b)有語法錯,不能執行
(c)一次也不執行 (d)執行1次
此題如果理解為k等於1時循環才執行,那么“k++”不被執行,k的值就始終為0,這時就把c選上了。其實,while循環的條件是一個賦值表達式,答案為a。
第三類,表達式的值
與變數的值
題例:有以下程式
int a=2;
int f(int 漚)
{return (漚)++;}
main( )
{ int s=0;
{ int a=5;
s+=f(&&a);
}
s+=f(&&a);
printf("%d\n",s);
} 執行後輸出結果是()
(a)10 (b)9 (c)7 (d)8
答案是c。
此題有兩個要點,1是局部變數與全局變數的作用範圍,2是,函式f(&&a)返回的是表達式 (漚)++的值,而不 a的值。
第四類,把關係表達式有別於數學上的關係式
題例:有以下程式
main()
{ int a=5,b=4,c=3,d=2;
if(a>b>c)
printf("%d\n",d);
else if((c-1>=d)==1)
printf("%d\n",d+1);
else
printf("%d\n",d+2);
}
執行後輸出結果是 ( )
(a)2 (b)3
(c)4 (d)編譯時有錯,無結果
這道題的關鍵在(a>b>c),答案容易判斷為a,5大於4也大於3,就把整個表達式判斷為真值,其實,a>b已為真值,1>c則成了假值,所以答案為b。
第五類,字元串的拷貝,
拷成了同一個字元
題例:若有定義語句:char s[100],d[100]; int j=0, i=0;,且s中已賦字元串,請填空以實現字元串拷貝。(註:不得使用逗號表達式)
while([i]){ d[j]= 【 】;j++;}
d[j]=0;
這裡容易只看到當前,忽略了還有其他字元,錯填為s[i]。答案為s[i++]。