等级考试(笔试)虽然知识面比较广,但不是很深,基础部分考的是你日常操作的能力,程序设计多数是考你的细心。辛辛苦苦准备了大半年,又经过2个小时的考场之战,交卷之后还很“自美”,成绩单上的“不及格”让你一时不敢相信自己的眼睛。 pKzrdw-!
8h{;*Wr-
当对着答 案细细“品味”时,你会N次的感叹……原来“罪魁祸首”是“不细心”。 VthM`~3
f1wwx|b%.
综观这四年来的考题,对容易出错的典型题例作了汇总和分析,也好给以后参加二级C考试的朋友增加点免疫力吧。本文将分三次刊登。 Fu*Qci1Z
N
6t `45
第一类,审题不清 oFDJwOJ'Bj
o%3VE8-
1.审题时的一字之差。 FNHJHuTe
Sd?+j;/"
一定要搞清题意,题目让我们选择的是“正确”还是“不正确”的;“能”还是“不能”的;本来要求选出一个错误的答 案,但题目中没有“错误”字样,而是说 “……请选出不正确的一项”,一不小心你就可能会把选项中最前面一个“正确”的选为答 案,因“正确”的有三个选项,当然觉得很容易,就这样,“错误”轻易地从你的笔尖溜走了。 5X}OUn8
omZ
bn
2.不注意文字部分的要求和说明。 }Zp5d7(@w
Lv<)Dur0K
很多时候,为了省时间,上来就去看程序,这样不仅不能省时间,还会走弯路、出错误。看看下面的两个例子吧! mKZ^FgG
lfe^_`ij(+
题例1:以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 #(dERET*
;Ebpf J
#include 'U{6LSaCb
G1S:hw%rp
void f(char p[][10],int n) &aWY{ ?_
8
huB<^
{略} 0$I!\y\
V?C_PMa
main() e*/ya 8p?
=G-u "QJ6
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; S+M:{<AR
idGhWV'
f(p,5); printf("%d\n",strlen(p[0])); } ghVxcK
}<
m@82\
程序运行后的输出结果是 1Jn:huV2
nk+*M9r|I
(A)6 (B)4 (C)5 (D)3 .,( ,<
S$%Y{
(为了节省版面,把函数f的内容略去了。)看过文字说明,接着看主函数,就可以锁定这个字符串是“dcdbe”,而不用花时间去分析函数f。要注意的是:别把最长的一串当成最大的字符串噢,看上“aabdfg”可就错了,答 案应为C。 :taRCh5
1`I#4f
题例2: 以下程序中给指针p分配三个double型动态内存单元,请填空。 jY8u1z
Rss=ihlM
# include Jm{~H%
pTzfc`~xv
main ( ) }RY&f4&GV,
'<KzWxuC
{ double ?p; dD}!E
G8ksm2 }
p=(double ?) malloc(【 】); ,';+A{aV
A}Gj;vaw
p[0]=1.5;p[1]=2.5;p[2]=3.5; m[!AOln)
ICI8xP}a?
printf("%f%f%f\n",p[0],p[1],p[2]);} fP
5!`8
^jMo?Zwy
如果上来就看程序,就会忽略“给指针p分配三个double型动态内存单元”,这里要求“三个”,如果大笔一挥写出了sizeof(double)可就太冤枉了,其实应该是3?sizeof(double)。 KqT~MPl
x1ID6kI[{*
第二类,把“赋值”看成了“等于” !kg)8 4C[
R@H}n3,
题例:有以下程序段 ;r
XhK$
)QiHe}
int k=0 u:7=Yy
:
`O/RNMaC
while(k=1)k++; 7f`x-iH!]7
.1C|J
while 循环执行的次数是: :j m|)
|Zo_x}0
(A)无限次 (B)有语法错,不能执行 Oz1ou[8k
%1p4K)
(C)一次也不执行 (D)执行1次 ,Uv8[ci%9
yYvv;E
此题如果理解为k等于1时循环才执行,那么“k++”不被执行,k的值就始终为0,这时就把C选上了。其实,while循环的条件是一个赋值表达式,答 案为A。 ~IE5j,SC
wOp# mT
第三类,表达式的值与变量的值 ]\:FFg_O6t
W<uL{k.Kpd
题例:有以下程序 A*:(%!
UW[{Y|oE
int a=2; 4';]fmf@[i
;ckv$S[p
int f(int ?a) 6c>tA2G|8
4IYC;J2L
{return (?a)++;} w5(GRAH
$PQlaivA
main( ) 5}4MXI4
jdY v*/^
{ int s=0; ^Y:Q%?uB/
\'L6m1UZ%
{ int a=5; r4c3t,L*$I
E4'D4@\W
s+=f(&&a); )LYj,do
$u4esg
} ,b@0Qa"
g/q$;cB
s+=f(&&a); 0OMyE9jJJ
dMwVgc:
printf("%d\n",s); V6d*O`
~j\/3;^s
} 执行后输出结果是() Y4Z?`TL
wz!]]EQ!o
(A)10 (B)9 (C)7 (D)8 I$`Vw >
ytmlG%
答 案是C。 >~$ S!
z~oGd,
此题有两个要点,1是局部变量与全局变量的作用范围,2是,函数f(&&a)返回的是表达式 (?a)++的值,而不? a的值。 ~::gLm+f
t@/r1u|iq
第四类,把关系表达式有别于数学上的关系式 <][|,9mw
79%${ajSI
题例:有以下程序 t
MB;GIb#
DZXv3gnX
main() A?;/]m;
,7M9f
{ int a=5,b=4,c=3,d=2; &K^h'>t'
r\[HR ^`
if(a>b>c) |l ~BdP
3MjMN %{P
printf("%d\n",d); 3a{QkVeV7
~pj9_I
else if((c-1>=d)==1) n37( sKG
_'AIXez7q
printf("%d\n",d+1); nwN<Q\]S
nL+*Ja
else (7ew&u\Li
F;ONo.v;
printf("%d\n",d+2); -r-`T
s
u(ZS sftat
} i%*x7zjY{
@R2|=ox
执行后输出结果是 ( ) mk4%]t"
v!F(DP.)Z
(A)2 (B)3 4g1u9Sc0
JpDYB
(C)4 (D)编译时有错,无结果 Y+?bo9CES!
$zmES tcm
这道题的关键在(a>b>c),答 案容易判断为A,5大于4也大于3,就把整个表达式判断为真值,其实,a>b已为真值,1>c则成了假值,所以答 案为B。 C
[2tH2*#
/2HwK/RZ
第五类,字符串的拷贝 Gcs+@7!b
$;;?'!%.
拷成了同一个字符 Zc9
n0t[
82)d.>
题例:若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝。(注:不得使用逗号表达式) C#I),LE|d{
KH
KqE6
while(){ d[j]= 【 】;j++;} LOida# R
yl'~H;su
d[j]=0; 8:&@MZQ&!
2CxdNj
这里容易只看到当前,忽略了还有其他字符,错填为s。答 案为s[i++]。