等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 tX s\R(?T
VscE ^'+
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 y dA8wL
<)H9V-5aZ
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 oJz^|dW
N:/D+L
第一类,审题不清 FDs>m
#e
sY&IquK^
1.审题时的一字之差。 i-_mTY&M
+7.',@8_V
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 5|s\*bV`
Xl#ggub?
2.不注意文字部分的要求和说明。 +'HqgSPyb
AQvudx)@"
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! ]h+j)J}[A
F^;ez/Gl
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 |u<7?)mp
hL{KRRf>
#include m<Dy<((_I
&j"?\f?
void f(char p[][10],int n) YjKxb 9
",; H`V
{略} C_JNX9wv
'-~~-}= sJ
main() k?^z;Tlvw
(hbyEQhF
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; #)O65GI
S4z;7z(8+
f(p,5); printf("%d\n",strlen(p[0])); } `Ggbi4),
Z@!+v19^
程序运行后的输出结果是 Wh*uaad7
H<,gU`&R
(A)6 (B)4 (C)5 (D)3 BW4J> {
5U$0F$BBp
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 +ye3HGD
HIZe0%WPw
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 igPX#$0XU
@*((1(q
# include '5$b-x6 F
)jP1or
main ( ) oUU1+F-
Tyx_/pJT
{ double ?p; h S&R(m
zQd
2
p=(double ?) malloc(【 】); b8 likP"T
kt:!
7
p[0]=1.5;p[1]=2.5;p[2]=3.5; [7Oe3=
uKHxe~
printf("%f%f%f\n",p[0],p[1],p[2]);} -[.[>&`/
(f"4,b^]
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 "^%cJAnLX
h2d(?vOT
第二类,把“赋值”看成了“等于” C LRdm^B
0 @oJFJrO
题例:有以下程序段 /gP+N2o+}
fNFY$:4X
int k=0 +CNv l
oCz/HQoBk
while(k=1)k++; }BP;1y6-r
4.t-i5
while 循环执行的次数是: DB,J3bm
cbTm'}R(G
(A)无限次 (B)有语法错,不能执行 a&? :P1$
ep{FpB
(C)一次也不执行 (D)执行1次 _oeS Uzq.
G4"F+%.
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 |yPu!pfl
sfl<qD+?
第三类,表达式的值与变量的值 xJ.M;SF4
=t?F6)Q
题例:有以下程序 6Z"X}L,*
x[e<} 8'$(
int a=2; Qo|\-y-#
k!Y, 63V=
int f(int ?a) yJIscwF
p4Z(^+Aa
{return (?a)++;} ;RlxD 4p
f3y=Wxk[
main( ) j#4kY R{
2D5StCF$O
{ int s=0; y?3;06y|
N8df8=.kw
{ int a=5; < =IFcN
G 01ON0
s+=f(&&a); P]C<U aW'!
pd$[8Rmj_
} 5)X=*I
2GG2jky{/
s+=f(&&a); S3J^,*'
~a2}(]
printf("%d\n",s); ftSW
(og
#GFr`o0$^
} 执行后输出结果是() iWR)ke
#KvlYZ+1
(A)10 (B)9 (C)7 (D)8 'V>-QD%1
gjlx~.0d
答 案是C。 CTmT@A{
Dw"\/p:-3
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 r9XZ(0/p
|DwZ{(R"W
第四类,把关系表达式有别于数学上的关系式 rPm x
#<xm.
题例:有以下程序 [nh>vqum
/x *3}oI
main() o4WDh@d5S
8{ I|$*nB
{ int a=5,b=4,c=3,d=2; @O~pV`_tD
dc'Y`e
if(a>b>c) ^B^9KEjTz
# f\rt
printf("%d\n",d); $/ ],tSm
N$tGQ@
else if((c-1>=d)==1) cZ3v=ke^
ia?
c0xL
printf("%d\n",d+1); Iga024KR
vih9KBT
else 4^d?D!j
y1#1Ne_
printf("%d\n",d+2); 2~2 O V
,#K'PB4 E
} iURe( [@
6S{l'!s'
执行后输出结果是 ( ) +w~oH =
y
B$x>Q'C(
(A)2 (B)3 'N(R_q6MW
#0<XNLM
(C)4 (D)编译时有错,无结果 xYB{;K
D6Wa.,r
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 moE2G?R
!@"OB~
第五类,字符串的拷贝 Alq(QDs
A=>u
1h69
拷成了同一个字符 uw8f ~:LT
p
K$`$H
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) v` r:=K
5IG-~jzCLb
while(){ d[j]= 【 】;j++;} 5-A\9UC*@
7[wPn`v2
d[j]=0; "wc<B4"
-n;}n:wL
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。