等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 |?J57(
1Z
~C3)T=
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 s``a{ HZ
'1DY5`i{
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 =iB[sLEJ
O\f`+Q`0
第一类,审题不清 T(u;<}e@[
lZRO"[<
1.审题时的一字之差。 sxr,]@
[_%u5sc-y
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 4v>SXch
! 7V>gWhR
2.不注意文字部分的要求和说明。 47(_5PFb#
xGyl7$J
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! *Zg=cI@)(
gpyio1V>
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 \%r0'1f
,gk'8]
#include H0&wn#);6R
p#qla'
void f(char p[][10],int n) 7~J>Ga
-3yK>\y=|
{略} yKUxjb^b\
4z P"h0
main() g%=K
rO
].d%R a:{
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; 7WH'GoBh
dH5*%
f(p,5); printf("%d\n",strlen(p[0])); } MR,I`9P e
423%K$710
程序运行后的输出结果是 [2xu`HT02
|BM#r fQ
(A)6 (B)4 (C)5 (D)3 SrNc
u(3 uZ:
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 ?i_/f} .K
p,k1*|j
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 >Z*b0j
}%}$h2:
# include 5\zR>Tg".
;39a`
main ( ) yw:%)b{
u9Adu`
{ double ?p; VF11eZ"
;]xc}4@=mg
p=(double ?) malloc(【 】); pHb,*C</
|LJv*
p[0]=1.5;p[1]=2.5;p[2]=3.5; SVwxK/Fci
_,0.h*c
printf("%f%f%f\n",p[0],p[1],p[2]);} ,7cw%mQA
Z] r9lC
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 O7IYg;
>QJDO ]~V
第二类,把“赋值”看成了“等于” =Bc{0p*
y`$qcEw
题例:有以下程序段 {q$U\y%Rq
Q)4[zStR#
int k=0 #tUhul/O
:RIqA/
while(k=1)k++; [u*7( 4e
.<%q9Jy#
while 循环执行的次数是: jTqJ(M}L
X}
V]3
(A)无限次 (B)有语法错,不能执行 FZU1WBNL%t
:(OV{ u
(C)一次也不执行 (D)执行1次 GGwwdB\x'
6(?@B^S>2
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 0Y* "RbG
$#/8l58
第三类,表达式的值与变量的值 2vB,{/GXP
XFs7kTY
题例:有以下程序 um]N]cCD`
65@GXn[W_
int a=2; f#AuZ]h
ER-Xd9R
int f(int ?a) 'bZw-t!M@
LjGLi>kI~
{return (?a)++;} ZTqt 4H
_"D J|j
main( ) OAo03KW
kz1Z K
{ int s=0; wp8-(E^
tMU10=d
{ int a=5; B
(h`~pb
gjK: a@{
s+=f(&&a); HW_2!t_R
-$%~EY}
} D5@}L$u
O.Dz}[w
s+=f(&&a); K4Nz I9@
4E!Pxjl 3a
printf("%d\n",s); >d
.|I&
S=<
]u
} 执行后输出结果是() nx`W!|g$`
V#1v5mWVx
(A)10 (B)9 (C)7 (D)8 ?JRfhJ:j
GQ.akA_(
答 案是C。 ;$!0pxL)s
FDFVhcr
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 #/`MYh=!W
|M<R{Tt}nf
第四类,把关系表达式有别于数学上的关系式 Z^A( Q>{e
?|2m0~%V=
题例:有以下程序 },5LrX`L
n#GHa>p.-
main() o'P[uB/
*0a7H$iQ(]
{ int a=5,b=4,c=3,d=2; M tDJ1I%
;''S};
if(a>b>c) u4=ulgi
-Vg0J6x
printf("%d\n",d); 0j#$Swa
L(`q3>iC4.
else if((c-1>=d)==1) 8p~[8}
ocp3J R_0
printf("%d\n",d+1); %HZ!s
`w_
b$Bq#vdg:
else +(q
r {G?
6l>016 x
printf("%d\n",d+2); @yPI$"Ma
q*J-ii
} 7,9zj1<
\w{fq+G
执行后输出结果是 ( ) =U~\iJ
Q},uM_"+
(A)2 (B)3 DGAg#jh
7XIG ne%v
(C)4 (D)编译时有错,无结果 a<D]Gz^h
2-wvL&pi)
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 5U l=Nv]
f=MR.\
第五类,字符串的拷贝 Y2p~chx9
"l09Ae'V
拷成了同一个字符 OEN'c0;5
.3,Ow(3l
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) Vuo 8[h>
L@5g#mSl
while(){ d[j]= 【 】;j++;} [SLBA_d
_UeIzdV9
d[j]=0; h@?BA<'S
pe@/tO&I
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。