等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 JxLD}$I
;-T%sRI:|
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 ,LJX
E@\bFy_!>b
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 $+a2CZs!
To19=,:
第一类,审题不清 |Xl,~-.
DvvjIYB~
1.审题时的一字之差。 | (a<b
P(za8l>
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 cLe659 &
H?axlRmw3
2.不注意文字部分的要求和说明。 }x1p~N+;
? k*s!YCZ
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! ``mW\=fe
G@igxnm}
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 skP2IMa75
O486:tF
#include ryp@<}A]!d
E`SFr
void f(char p[][10],int n) 9:tKRN_D
cB9`U4<
{略} KCkA4`IeM
HLcK d`$/
main() {!hA^[}|
n.$wW
=
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; 9L'R;H?L
wA<#E6^vG
f(p,5); printf("%d\n",strlen(p[0])); } lvz&7Z b
0UvN ws
程序运行后的输出结果是 Iz\IQa
85 tQHm6j
(A)6 (B)4 (C)5 (D)3 X}v]iX
RHGs(d7-
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 wDV%.Cc
S:GX!6>
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 +;Jb)8
I)Dd"I
# include VL/%D*
\{ G1d"n
main ( )
$z~sN
5? `*i"
{ double ?p; sC Fqz[I
3%<xM/#
p=(double ?) malloc(【 】); nx >PZb
^L(}c O
p[0]=1.5;p[1]=2.5;p[2]=3.5; J!o[/`4ib
q|.
X[~e|
printf("%f%f%f\n",p[0],p[1],p[2]);} 1dF=BR8
-$4#eG%3
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 do9@6[{Sv
~E=.*: 5(
第二类,把“赋值”看成了“等于” el*C8TWlw
S/|'ggC
题例:有以下程序段 +_HPZo
ajayj|h
int k=0 .4"9o%
$gN1&K
while(k=1)k++; 0FFx
x62b=k}
while 循环执行的次数是: 0k5;Qf6A
&41=YnC6
(A)无限次 (B)有语法错,不能执行 zR_#c3o
&LO<!WKQ
(C)一次也不执行 (D)执行1次 E+AEV`-
)x-iru
A:
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 2!/_Xh
(DCC4%w"
第三类,表达式的值与变量的值 H/p<lp
3r?Bnf:
题例:有以下程序 /YWoDHL
-<jb>8
int a=2; iO;q]
k, )7v
int f(int ?a) \Clz#k8l1
`RUr/|S
{return (?a)++;} `5;O|qRq
sAIL+O
main( ) SnRTC<DDh
q79)nhC F
{ int s=0; &_
Ewu@4
n`T
4aDm
{ int a=5; W
xyQA:3s
7'_zJI^
s+=f(&&a); O^I~d{M 5I
wxARD3%
} $WvI%r
5@"&%8oeq0
s+=f(&&a); L=Q-r[
,8g~,tMr+
printf("%d\n",s); y@J]busU
_cx}e!BK#
} 执行后输出结果是() Xi_>hL+R(
W{l+_a{/9
(A)10 (B)9 (C)7 (D)8 ;8;nY6Ie
W|3XD-v@
答 案是C。 *A`hKx
-c!{';Zn
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 HH3WZ^0>
2i#wJ8vrF
第四类,把关系表达式有别于数学上的关系式 ;uNcrv0J
mCe,(/>l+
题例:有以下程序 &"fMiK3
K IiV z<
main() )JTh=w4n|z
n8Jx;j
{ int a=5,b=4,c=3,d=2; A?q[C4-BO,
g.X?wyg5
if(a>b>c) to^ &:
&F[/@
printf("%d\n",d); Y4}!9x
I@a7AuOw
else if((c-1>=d)==1) f3s0.G#l
|cJyP9}n
printf("%d\n",d+1); C<2vuZD
H=z@!rJc.
else g1L$+xD^
%xf6U>T
printf("%d\n",d+2); XRKL;|cd
s2iR }<
} qr$=oCqa
Z:09]r1
执行后输出结果是 ( ) xj)*K%re
cUaLv1:HI
(A)2 (B)3 p-UACMN&c
Ttb@98
(C)4 (D)编译时有错,无结果 1?`,h6d*=
|:`f#H
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 -]R7[5C:
C
7YZ;{t
第五类,字符串的拷贝 gzvEy^X
bT*MJ7VVm
拷成了同一个字符 P*T'R
97e fWYj
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) 3Tg
7qV_QZ!.
while(){ d[j]= 【 】;j++;} K7Kd{9-2
Byyus[b'A
d[j]=0; ej4 7'#EY
g4&zBn
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。