等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 V\]" }V)"
)$Mmn
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 (ljF{)Ml+=
L';MP^
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 44ed79ly0)
Hr<o!e{Y
第一类,审题不清 nH|,T%
uC3:7
1.审题时的一字之差。 Z8#Gwyinx
)~J>X{hy
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 (ll*OVL
Kl{>jr8B3
2.不注意文字部分的要求和说明。 bx4'en#
S~Z|PLtF
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! 4mjgt<`
wC_l@7t
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 nl aM
%+>s#Q2d
#include @Ky> 9m{
b2,mCfLsv
void f(char p[][10],int n) $2^`Uca
/cr}N%HZB
{略} D]a:@x`+Bz
N,dT3we
main() WEg6Kz
3.d"rl
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; \c v?^AI
6lwta`2
f(p,5); printf("%d\n",strlen(p[0])); } ._w8J"E5
u]-_<YZ'B
程序运行后的输出结果是 7;@ST`cC
KlV:L 4a~
(A)6 (B)4 (C)5 (D)3 TGXa,A{
{GDmVWG0q
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 Rlnbdb;!k
`p
b5*h6r!
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 ).` S/F
n% 'tKU\q
# include =gfI!w
Ho DVn/lr
main ( ) uwf
5!Z:>
n+@F`]Ke
{ double ?p; H1GRMDNXOA
D4eTTfQ
p=(double ?) malloc(【 】); Oa;X+
NjPDX>R\K
p[0]=1.5;p[1]=2.5;p[2]=3.5; a,F&`Wg
D(p\0V
printf("%f%f%f\n",p[0],p[1],p[2]);} CQ`=V2:"ON
T _b^ Tc`
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 bNFLO
Q
iv`O/T
第二类,把“赋值”看成了“等于” IK,|5] *Ar
>Vy>O&r
题例:有以下程序段 NK|? y
^ -FX
int k=0 ?
J}r
CQel3Jtt.
while(k=1)k++; Fhv/[j^X
Mb3}7 @/[
while 循环执行的次数是: ,B4VT 96*
}X
GEX:1K
(A)无限次 (B)有语法错,不能执行 oH0X<'
M8H5K
(C)一次也不执行 (D)执行1次 h)~=Dm
#HS]NA|e@
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 <YA&Dr3OD
N#lDW~e'
第三类,表达式的值与变量的值 XwV'Ha
G?f\>QSZ
题例:有以下程序 1/p*tZP8i
5es[Ph|K5
int a=2; :o:e,WKxb
dz~co Z9
int f(int ?a) UAR5^
^[%%r3"$C
{return (?a)++;} eC5 $#,HiC
6wco&7
main( ) zF5uN:-s
dU\%Cq-G)
{ int s=0; ?#yV3h|Ij
8|E'>+ D_-
{ int a=5; e><5Pr)
G=;k=oX(
s+=f(&&a); >~`C-K#
Kwc6mlw~M
} s2j['g5
.]aF
1}AI
s+=f(&&a); x0d~i!d
Bgmn2-
printf("%d\n",s); Ra*e5
4&/j|9=X
} 执行后输出结果是() "c}@V*cO<d
cb5,P~/q
(A)10 (B)9 (C)7 (D)8 ?g!V!VS2
''\;z<v
答 案是C。 ~4q5
k5.,
NEa>\K<\
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 9&RFO$WH
FI"`DMb}
第四类,把关系表达式有别于数学上的关系式 ~ %B<
r\nx=
题例:有以下程序 m Sk5u 7
5k|9gICyd*
main() /b|0PMX
y4+;z2'>
{ int a=5,b=4,c=3,d=2; k+1|I)z
e8'wG{3A
if(a>b>c) KR7@[
A.UUW
printf("%d\n",d); fib}b?vk
qY 4#V k
else if((c-1>=d)==1) dg4vc][
_)]CzBRq\6
printf("%d\n",d+1); `K,1K
dL|+d:v
else d#2$!z#
VbBPB5 $q
printf("%d\n",d+2); RmZ]"
`
l7De6A"
} .$@R{>%U
%e&9.
执行后输出结果是 ( ) eW|^tH
IKie1!ZU{"
(A)2 (B)3 3]?#he
zSb PW6U
(C)4 (D)编译时有错,无结果 aZbw]0q@o
_#vrb;.+
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 (rg;IXAq%
/PsnD_s]5
第五类,字符串的拷贝 ^]
kF{
o?
ytNO*XoR
拷成了同一个字符 =_0UD{"_0
]r_;dY a
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) -\#0]F:-
/r_~:3F
while(){ d[j]= 【 】;j++;} U4G`ZKv(!
.KdyJ6o
d[j]=0; %\i9p]=
fU!<HDh
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。