等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 Nh/ArugP5P
:Zo2@8@7
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 <%uZwk>#
~6i mkv^ F
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 S%#Mu|
<!XnUCtV
第一类,审题不清 A_U0HVx_
C)}LV
1.审题时的一字之差。 !O_^Rn+<2
~M1%,]
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 ,?~,"IQyi[
8Kkr1}!wd
2.不注意文字部分的要求和说明。 @5GP;3T
5g7}A`
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! cty#@?"e
-3U}
(cZ*
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 <{Wa[1D
_tJURk%
#include o;C)!
|q)Q<%VS'
void f(char p[][10],int n) GQxJ (f
uW_ /7ex
{略} wb"t:(>&
j'cCX[i
main() '-TFr NO;h
sJ()ItU5i
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; me\)JCZpb{
s_kd@?=`x
f(p,5); printf("%d\n",strlen(p[0])); } Yr0i9Qow
824%]i3
程序运行后的输出结果是 vtjG&0GSK
cu|q&
(A)6 (B)4 (C)5 (D)3 y%Ah"UY
:PkSX*E[q
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 nwH|Hs riU
Ia"
Mi+{
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 ueo3i1
#R|4(HlL
# include s#49pDN
l%/,Ef*3
main ( ) X)5O@"4 ?
?"Q6;np*
{ double ?p; \LXNdE2B
BtZm_SeA
p=(double ?) malloc(【 】); [-a/]
vUA`V\
p[0]=1.5;p[1]=2.5;p[2]=3.5; NYRNop( N#
yB[LO(i
printf("%f%f%f\n",p[0],p[1],p[2]);} Rvo<ISp
mAKi%)
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 oaE3Aa
!{\c`Z<#
第二类,把“赋值”看成了“等于” "5bk82."
(>23[;.0
题例:有以下程序段 ,pepr9Yd
9rz "@LM
int k=0 VtFh1FDI\
~.tu#Y?
while(k=1)k++; UzXbaQQ2g
cFQa~
while 循环执行的次数是: dno*Usx5d0
Atw^C+"vW&
(A)无限次 (B)有语法错,不能执行 =r8(9:F!
54&2SU$kx
(C)一次也不执行 (D)执行1次 dRmTE
#^Y-*vf2
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 /@e\I0P^
C: cu1Y9
第三类,表达式的值与变量的值 z/=v@@tj
cj)~7 WF
题例:有以下程序 T@.CwV
hz|$3*q
int a=2; zQJbZ=5Bu"
f5v|}gMAX
int f(int ?a) 5+J/Qm8{bb
glpdYg *
{return (?a)++;} LV0{~g(!%
*V}}3Degh
main( ) )Ec;kr b+
nq;)!Wry
{ int s=0; $?YkgK
/uVB[Tk^
{ int a=5; A{vG@Pwc:
M?o`tWLhF
s+=f(&&a); +Xk!)Ge5E*
rO~D{)Nu
} ;I0/zeM%
Z8W<RiR
s+=f(&&a); HT'dft #
qeYr= %)c
printf("%d\n",s); [+GG Wo
KqQrxi?f-
} 执行后输出结果是() !p2&$s"N.
)mU)7@!
(A)10 (B)9 (C)7 (D)8 \wd~Y
%lxo?s@GE
答 案是C。 \BDNF<_
E =E
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 %-dGK)?
2iu;7/
第四类,把关系表达式有别于数学上的关系式 -?[:Zn~$a
q$K~BgFzpZ
题例:有以下程序 0M"E6z)9
0=04:.%D
main() bCsQWsj^NW
c-,/qn/
{ int a=5,b=4,c=3,d=2; K;Ktx>Z/
l"Css~^
if(a>b>c) CH2o[&
8PQ& 7o
printf("%d\n",d); 1/z1~:Il
X qh+
else if((c-1>=d)==1) 2Y,s58F
O/-xkzR*
printf("%d\n",d+1); n\QG-?%Pi
C$_H)I
else .R1)i-^
zr,jaR;
printf("%d\n",d+2); e&:fzO<~I
k3Y>QN|q8
} 3wK)vW
yF*JzE 7,
执行后输出结果是 ( ) g+f{I'j
sx9N8T3n
(A)2 (B)3 UuN(+&oD-
:%Bo)0a9
(C)4 (D)编译时有错,无结果 OIN]u{S
Qtk'^Fc
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 Qr/?tMALc
+}^
第五类,字符串的拷贝 7BC9cS(0w9
Y$N|p{Z
拷成了同一个字符 1{A4_/R
te1lUQ
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) pDu~84!])
j*P@]&e7d
while(){ d[j]= 【 】;j++;} 2 `#|;x^<
9Y7 tI3
d[j]=0; /%.K`BMN
sg3%n0Ms.W
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。