等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 O9:U8$*
(rg;IXAq%
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 ZoArQ(YFy
^_lzZOhG
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 8b0d]*q
QNDHOo>v
第一类,审题不清 r_;9'#&'
H.UX,O@
1.审题时的一字之差。 qY[xpm
} (!EuLL
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 n@ G[
<oz!H[!
2.不注意文字部分的要求和说明。 =N 5z@;!
yv)ux:P&+
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! 4V~?.
YtO|D
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 aN(|'uO@
/a6Xa&(B
#include ES40?o*]x
rb{P :MX
void f(char p[][10],int n) [|l?2j\
2<}NB?f`N
{略} 0>zbCubPH
S6[v;{xJ
main() xZV1k~C
VWO9=A*Y|
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; <jed!x
@$T 9Ll
f(p,5); printf("%d\n",strlen(p[0])); } ,*7d
v%ioj0,
程序运行后的输出结果是 D1&A,2wO
a+Ac[>
(A)6 (B)4 (C)5 (D)3 S%`0'lzzj
MQ"xOcD*F
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 2+X\}s1vN
+a*tO@HG
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 y{N-+10z
L5,NP5RC
# include ;amXY@RmH
8(* [Fe9
main ( ) NQ6sGL
NC38fiH_N
{ double ?p; >;[*!<pfK5
tToTxf~
p=(double ?) malloc(【 】); @9"J|}
~
yX2\i"
p[0]=1.5;p[1]=2.5;p[2]=3.5; 8]LD]h)B"
=kuMWaD
printf("%f%f%f\n",p[0],p[1],p[2]);} =W'Ae,&
AA7C$;Z15~
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 #_u~/jhX
z[;z>8|c
第二类,把“赋值”看成了“等于” yeMB0Z*r
6H7],aMg$A
题例:有以下程序段 5;HH4?]p
mWvl38
int k=0 ynrT a..
K1T4cUo
while(k=1)k++; 6AhM=C
<%"b9T`'
while 循环执行的次数是: 5s].
@C8
yNbjoFM.i
(A)无限次 (B)有语法错,不能执行 #Q
/Arq
3p'I5,}
(C)一次也不执行 (D)执行1次 Z+=@<i''
1aTB%F
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 %QP0
`V04\05
第三类,表达式的值与变量的值 [)TRTxFb
j{Q9{}<e
题例:有以下程序 kbe-1 <72
5bgs*.s
int a=2; wY_)y
7yh/BZ1
int f(int ?a) c.e2 M/
q0zr
E5
{return (?a)++;} MpR2]k#n<
Sb82}$sO
main( ) ?)ONf#4Y
WA&!;Zq
{ int s=0; 5f 5f0|ok
w {3<{
{ int a=5; qO|R^De
av|g}xnj
s+=f(&&a); &eX!#nQ_.
s|y "WDyx5
} m+T;O/lG0{
=7m)sxj]w
s+=f(&&a); "9Q40w\
Rw0qcM\>|
printf("%d\n",s); ?BZ PwGMs
VG
;kPzze
} 执行后输出结果是() aq@8"b(.
tu66'z
(A)10 (B)9 (C)7 (D)8 d\gJ$ ~^K
[UWdW
答 案是C。 2$ze=
/ l
ia+oX~W!VR
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 kZGRxp9
IvtJ0
第四类,把关系表达式有别于数学上的关系式 =E#%'/ A;c
Oagsoik
题例:有以下程序 i\rDu^VQ
]Hefm?9*^
main() M:[ %[+6
Ku}Z
{ int a=5,b=4,c=3,d=2; 2$g6}A`r
\=ux atw
if(a>b>c) sl`s_$J
NRIG 1v>
printf("%d\n",d); .ufTQ?Fe
S]Mw#O|
else if((c-1>=d)==1) ,NyY>~+
TU,s*D&e
printf("%d\n",d+1); 'O_3)x5
b)qoh^
else `-J%pEIza
i/`m`qdg
printf("%d\n",d+2); qGB{7-r u
lJ}_G>GJ
} ?IqQ-C)6D
R\G0'?h
>
执行后输出结果是 ( ) sHt].gZ
2q=AEv/
(A)2 (B)3 bB1UZ O
$!-c-0ub
(C)4 (D)编译时有错,无结果 4gz
H8sF
}J:U=HJ
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 v4`"1Ss,K
0zlb0[
第五类,字符串的拷贝 :toh0oB[
:OhHb#D
拷成了同一个字符 qG?Qc (
7XTkX"zKj
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) Eg#K.5hJ
D%OQ e#!
while(){ d[j]= 【 】;j++;} jHE}qE~>5
i@)i$i4
d[j]=0; aW)-?(6>
@s ?
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。