全国计算机二级考试C语言易错知识点.docx
- 文档编号:6055536
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:24
- 大小:33.31KB
全国计算机二级考试C语言易错知识点.docx
《全国计算机二级考试C语言易错知识点.docx》由会员分享,可在线阅读,更多相关《全国计算机二级考试C语言易错知识点.docx(24页珍藏版)》请在冰豆网上搜索。
全国计算机二级考试C语言易错知识点
计算二级C语言易错知识点
1.指针是用来存放地址的变量,用(类型名*指针变量名)的形式定义。
赋值时应将*个变量地址即&*赋给指针变量
设fp为指向*二进制文件的指针,且已读到此文件末尾,则函数feof(fp)的返回值为
A)0
B)'\0'
C)非0值
D)NULL
【解析】此题考察文件的定位,feof函数的用法是从输入流读取数据,如果到达文件末尾〔遇文件完毕符〕,eof函数值为非零值,否则为0,所以选项C正确。
有以下程序
*include
main()
{
inta=5,b=1,t;
t=(a<<2)|b;
printf("%d\n",t);
}
程序运行后的输出结果是
A)1
B)11
C)6
D)21
【解析】此题考察位运算,以及按位或操作,将a左移一位相当于是将a乘以了4,所以a<<2等于20,二进制表示为00010100,与b按位或得到00010101,即21,所以选项D正确。
有以下程序
*include
*defineN5
*defineMN+1
*definef(*)(**M)
main()
{inti1,i2;
i1=f
(2);
i2=f(1+1);
printf("%d%d\n",i1,i2);
}
程序的运行结果是
A)127
B)1212
C)1111
D)117
【解析】此题考察宏定义的用法,宏定义只是做个简单的替换,所以此题中执行f
(2)=(2*N+1)=11,执行f(1+1)=(1+1*N+1)=7。
选项D正确。
有以下程序
*include
*include
structA
{
inta;
charb[10];
doublec;
};
voidf(structAt);
main()
{
structAa={1001,"ZhangDa",1098.0};
f(a);
printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
voidf(structAt)
{
t.a=1002;
strcpy(t.b,"ChangRong");
t.c=1202.0;
}
程序运行后的输出结果是
A)1002,ZhangDa,1202.0
B)1002,ChangRong,1202.0
C)1001,ChangRong,1098.0
D)1001,ZhangDa,1098.0
【解析】此题考察构造体的相关操作以及传值、传址的区别,该题中调用f函数后,会生成参数a的一个副本,而不会改变a的值,所以a值维持原值,选项D正确。
假定已建立以下链表构造,且指针p和q已指向如下列图的结点:
则以下选项中可将q所指结点从链表中删除并释放该结点的语句组是
A)p->ne*t=q->ne*t;free(q);
B)p=q->ne*t;free(q);
C)p=q;free(q);
D)(*p).ne*t=(*q).ne*t;free(p);
【解析】此题考察删除链表中的节点操作,其方法是将要删除节点的上个节点的下个节点指向要删除节点的下个节点,然后释放该要删除节点,所以选项A正确。
以下构造体类型说明和变量定义中正确的选项是
A)structREC;
{intn;charc;};
RECt1,t2;
B)typedefstruct
{intn;charc;}REC;
RECt1,t2;
C)typedefstructREC;
{intn=0;charc='A';}t1,t2;
D)struct
{intn;charc;}REC;
RECt1,t2;
【解析】此题考察构造体的相关知识,选项A中structREC后面不能有分号,C选项中typedefstructREC的后面也不能有分号,选项D中REC已经是构造体变量,不能当做构造体类型来使用。
以下函数的功能是
voidfun(char*a,char*b)
{
while((*b=*a)!
='\0')
{a++;b++;}
}
A)将a所指字符串赋给b所指空间
B)使指针b指向a所指字符串
C)将a所指字符串和b所指字符串进展比较
D)检查a和b所指字符串中是否有'\0'
【解析】While循环条件为:
(*b=*a)!
='\0',执行时先把指针a所指向的字符赋给指针b所在内存单元,如果该字符不是完毕标识"\0",执行循环体a++;b++;,指针a、b分别指向下一个字符单元。
再判断循环条件,如果成立,继续把指针a所指向的字符赋给指针b所在内存单元,直到遇到完毕标识为止。
因此A选项正确。
有以下程序
*include
voidfun(char*a,char*b)
{while(*a=='*')a++;
while(*b=*a){b++;a++;}
}
main()
{char*s="*****a*b****",t[80];
fun(s,t);puts(t);
}
程序的运行结果是
A)ab
B)a*b
C)*****a*b
D)a*b****
【解析】在函数fun(char*a,char*b)中,while(*a=='*')a++的功能是:
如果*a的内容为'*',则a指针向后移动,直到遇到非'*'字符为止,退出循环进入下一个while循环,在while(*b=*a){b++;a++;}中,把字符数组a中的字符逐个赋给字符数组b。
所以在主函数中,执行fun(s,t)语句后,字符数组t中的内容为"a*b****"。
因此D选项正确。
以下关于字符串的表达中正确的选项是
A)空串比空格打头的字符串小
B)两个字符串中的字符个数一样时才能进展字符串大小的比较
C)可以用关系运算符对字符串的大小进展比较
D)C语言中有字符串类型的常量和变量
【解析】字符串比较大小是以第1个不一样字符的大小为标准的,跟长度没有关系,B选项不正确;字符串比较大小除了使用库函数str3()以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小。
因为字符串在表达式中相当于constchar*,即常字符指针,代表的是字符串的首地址,关系运算符会将两个字符串的首地址值比较大小,这是毫无意义的。
C选项不正确。
C语言中只有字符串常量而没有字符串变量,D选项描述不正确;空串的长度为0,而以空格打头的字符串的长度至少为1,因此A选项是正确。
以下程序中函数f的功能是:
当flag为1时,进展由小到大排序;当flag为0时,进展由大到小排序。
*include
voidf(intb[],intn,intflag)
{
inti,j,t;
for(i=0;i for(j=i+1;j if(flag"b[i]>b[j]: b[i] {t=b[i];b[i]=b[j];b[j]=t;} } main() { inta[10]={5,4,3,2,1,6,7,8,9,10},i; f(&a[2],5,0); f(a,5,1); for(i=0;i<10;i++) printf("%d,",a[i]); } 程序运行后的输出结果是 A)1,2,3,4,5,6,7,8,9,10, B)3,4,5,6,7,2,1,8,9,10, C)5,4,3,2,1,6,7,8,9,10, D)10,9,8,7,6,5,4,3,2,1, 【解析】此题重点考察函数的参数传递,函数的参数传递分为传值和传地址两种情况。 此题就是结合数组考察参数传递的情形。 函数f完成的功能是对数据进展排序,语句f(&a[2],5,0)的作用是对从a[2]开场的5个元素进展从大到小排序。 注意: 这里传递的是地址&a[2],所以排序操作可看作是直接对数组a操作,执行后的结果为5,4,7,6,3,2,1,8,9,10。 语句f(a,5,1)对数组a的前5个元素从小到大排序,排序后数组为: 3,4,5,6,7,2,1,8,9,10。 因此B选项正确。 假设有定义语句: inta[2][3],*p[3]; 则以下语句中正确的选项是 A)p=a; B)p[0]=a; C)p[0]=&a[1][2]; D)p[1]=&a; 【解析】A选项错误,因为p是指向一个指针数组,作为数组名,不能指向别的地方。 B选项错误,因为p[0]是一个int指针,也就是int*;而a是一个指向指针的指针int**。 C选项正确,因为p[0]是一个int*,a[1][2]是int,&a[1][2]是int*,类型吻合。 D选项错误,因为a作为数组名,不能取地址,即使能取,p[1]是int*,&a是int***,类型不对。 因此C选项正确。 以下表达中错误的选项是 A)C程序必须由一个或一个以上的函数组成 B)函数调用可以作为一个独立的语句存在 C)假设函数有返回值,必须通过return语句返回 D)函数形参的值也可以传回给对应的实参 【解析】形参是函数定义时由用户定义的形式上的变量,实参是函数调用时,主调函数为被调函数提供的原始数据。 在C语言中,实参向形参传送数据的方式是"值传递〞。 因此D选项正确。 有以下程序 *include main() {inta=1,b=2; for(;a<8;a++){b+=a;a+=2;} printf("%d,%d\n",a,b); } 程序运行后的输出结果是 A)9,18 B)8,11 C)7,11 D)10,14 【解析】第一次循环a的值为1,满足条件,执行b+=a与a+=2,则b的值变为3,a的值变为3。 执行a++,a的值为4,满足条件进入第二次循环,执行完循环体后b的值为7,a的值为6。 执行a++,a的值为7,满足条件进入第三次循环,执行完循环体后b的值为14,a的值为9。 执行a++,a的值变为10。 所以选择D选项。 在以下给出的表达式中,与while(E)中的(E)不等价的表达式是 A)(E>0||E<0) B)(E==0) C)(! E==0) D)(E! =0) 【解析】while语句中条件表达式E的值不为0即为真,认为满足条件,所以与B选项中表达式的含义正好相反,选择B选项。 假设有定义: inta,b; 通过语句 scanf("%d;%d",&a,&b); 能把整数3赋给变量a,5赋给变量b的输入数据是 A)35 B)3,5 C)3;5 D)35 【解析】输入数据的格式必须与scanf()的格式控制串完全匹配,所以输入时必须在3和5之间输入";"。 以下关于C语言的表达中正确的选项是 A)C语言的数值常量中夹带空格不影响常量值的正确表示 B)C语言中的变量可以在使用之前的任何位置进展定义 C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言中的注释不可以夹在变量名或关键字的中间 【解析】C语言的数值常量中不能夹带空格,所以A错误。 C语言中的变量都必须先定义再使用,对变量的定义通常放在函数体内的前部,但也可以放在函数外部或复合语句的开头,不能随便放置,所以B错误。 在C语言中运算符两侧的运算数据类型可以不一致,且结果与精度较高的保持一致,所以C错误。 一个教师可讲授多门课程,一门课程可由多个教师讲授。 则实体教师和课程间的联系是( )。 A)1: 1联系 B)1: m联系 C)m: 1联系 D)m: n联系 【解析】因为一个教师可讲授多门课程,而一门课程又能由多个教师讲授所以他们之间是多对多的关系,可以表示为m: n。 负责数据库中查询操作的数据库语言是( )。 A)数据定义语言 B)数据管理语言 C)数据操纵语言 D)数据控制语言 【解析】数据定义语言: 负责数据的模式定义与数据的物理存取构建;数据操纵语言: 负责数据的操纵,包括查询及增、删、改等操作;数据控制语言: 负责数据完整性、平安性的定义与检查以及并发控制、故障恢复等功能。 下面描述中错误的选项是( )。 A)系统总体构造图支持软件系统的详细设计 B)软件设计是将软件需求转换为软件表示的过程 C)数据构造与数据库设计是软件设计的任务之一 D)PAD图是软件详细设计的表示工具 【【解析】详细设计的任务是为软件构造图中而非总体构造图中的每一个模块确定实现算法和局部数据构造,用*种选定的表达工具表示算法和数据构造的细节,所以A)错误。 *二叉树共有7个结点,其中叶子结点只有1个,则该二叉树的深度为(假设根结点在第1层)( )。 A)3 B)4 C)6 D)7 【解析】根据二叉树的根本性质3: 在任意一棵二叉树中,度为0的叶子结点总比度为2的结点多一个,所以此题中度为2的结点为1-1=0个,所以可以知道此题目中的二叉树的每一个结点都有一个分支,所以共7个结点共7层,即度为7。 以下表达中正确的选项是( )。 A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化 B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化 C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化 D)以上说法均不正确 解析】栈是先进后出的数据构造,在整个过程中,栈底指针不变,入栈与出栈操作均由栈顶指针的变化来操作,所以选择C)。 以下关于栈表达正确的选项是( )。 A)栈顶元素最先能被删除 B)栈顶元素最后才能被删除 C)栈底元素永远不能被删除 D)栈底元素最先被删除 解析】栈是先进后出的数据构造,所以栈顶元素最后入栈却最先被删除。 栈底元素最先入栈却最后被删除。 所以选择A)。 有以下程序: *include main() {unsignedchara=2,b=4,c=5,d; d=a|b;d&=c;printf("%d\n",d);} 程序运行后的输出结果是( )。 A)3 B)4 C)5 D)6 【解析】&按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。 |按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。 2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4。 以下表达中错误的选项是( )。 A)使用三种根本构造构成的程序只能解决简单问题 B)构造化程序由顺序、分支、循环三种根本构造组成 C)C语言是一种构造化程序设计语言 D)构造化程序设计提倡模块化的设计方法 正确答案: A 答疑: 【解析】使用顺序,选择(分支),循环三种根本构造构成的程序可以解决所有问题,而不只是解决简单问题,所以A)错误。 2.数据库应用系统中的核心问题是数据库的设计。 耦合性和内聚性是对模块独立性度量的两个标准。 以下表达中正确的选项是( )。 A)提高耦合性降低内聚性有利于提高模块的独立性 B)降低耦合性提高内聚性有利于提高模块的独立性 C)耦合性是指一个模块内部各个元素间彼此结合的严密程度 D)内聚性是指模块间互相连接的严密程度 正确答案: B 答疑: 【解析】模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。 一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性,所以A)错误,B)正确。 耦合性是模块间互相连接的严密程度的度量而内聚性是指一个模块内部各个元素间彼此结合的严密程度,所以C)与D)错误。 3.软件测试的目的是为了发现错误而执行程序的过程,并不涉及改正错误,所以选项A)错误。 程序调试的根本步骤有: 错误定位、修改设计和代码,以排除错误、进展回归测试,防止引进新的错误。 程序调试通常称为Debug,即排错。 软件测试的根本准则有: 所有测试都应追溯到需求、严格执行测试方案,排除测试的随意性、充分注意测试中的群集现象、程序员应防止检查自己的程序、穷举测试不可能、妥善保存测试方案等文件。 4.编译软件、操作系统、汇编程序都属于系统软件,只有C)教务管理系统才是应用软件。 冒泡排序与简单插入排序与简单项选择择排序法在最坏情况下均需要比较n(n-1)/2次,而堆排序在最坏情况下需要比较的次数是 *二叉树有5个度为2的结点,则该二叉树中的叶子结点数是( )。 A)10 B)8 C)6 D)4 正确答案: C 答疑: 【解析】根据二叉树的根本性质3: 在任意一棵二叉树中,度为0的叶子节点总是比度为2的节点多一个,所以此题中是5+1=6个。 5.栈支持子程序调用。 栈是一种只能在一端进展插入或删除的线性表,在主程序调用子函数时要首先保存主程序当前的状态,然后转去执行子程序,最终把子程序的执行结果返回到主程序中调用子程序的位置,继续向下执行,这种调用符合栈的特点,因此此题的答案为A)。 以下表达中正确的选项是( )。 A)当对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丧失 B)翻开一个已存在的文件并进展了写操作后,原有文件中的全部数据必定被覆盖 C)在一个程序中当对文件进展了写操作后,必须先关闭该文件然后再翻开,才能读到第1个数据 D)C语言中的文件是流式文件,因此只能顺序存取数据 正确答案: A 答疑: 【解析】B)选项中翻开一个已存在的文件并进展了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进展追加操作等。 C)选项中在一个程序中当对文件进展了写操作后,不用先关闭该文件然后再翻开,才能读到第1个数据,可以用fseek()函数进展重新定位即可。 D)选项中,C语言中的文件可以进展随机读写。 有以下程序: *include *include main() {int*a,*b,*c; a=b=c=(int*)malloc(sizeof(int)); *a=1;*b=2;*c=3; a=b; printf("%d,%d,%d\n",*a,*b,*c); } 程序运行后的输出结果是( )。 A)1,1,3 B)2,2,3 C)1,2,3 D)3,3,3 正确答案: D 答疑: 【解析】malloc函数动态分配一个整型的内存空间,然后把函数返回的地址用(int*)强制类型转换为整型指针,再把它赋给a,b,c,即让指针变量a,b,c都指向刚申请的内存空间。 所以只有最后一个赋值语句*c=3的值保存在了该空间内,因为a,b,c三个指针变量均指向该空间,所以打印该空间内的数值为3。 有以下程序: *include main() {unsignedchara=2,b=4,c=5,d; d=a|b;d&=c;printf("%d\n",d);} 程序运行后的输出结果是( )。 A)3 B)4 C)5 D)6 正确答案: B 答疑: 【解析】&按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。 |按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。 2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4。 有以下程序: *include *definePT3.5; *defineS(*)PT****; main() { inta=1,b=2;printf("%4.1f\n",S(a+b));} 程序运行后的输出结果是( )。 A)7.5 B)31.5 C)程序有错无输出结果 D)14.0 正确答案: C 答疑: 【解析】宏定义不是C语句,末尾不需要有分号。 所以语句printf("%4.1f\n",S(a+b));展开后为printf("%4.1f\n",3.5;*a+b*a+b;);所以程序会出现语法错误。 有以下程序: *include structS { inta,b;}data[2]={10,100,20,200}; main() { structSp=data[1]; printf("%d\n",++(p.a)); } 程序运行后的输出结果是( )。 A)10 B)11 C)20 D)21 正确答案: D 答疑: 【解析】声明data是构造S数组。 初始化data[0].a=10;data[0].b=100;data[1].a=20;data[1].b=200。 主函数中p=data[1];即p.a=data[1].a;p.b=data[1].b;执行语句printf("%d\n",++(p.a));打印输出时p.a先增1再打印。 p.a=data[1].a=20,先增1等于21。 以下表达中错误的选项是( )。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 正确答案: A 答疑: 【解析】关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型,所以A)错误。 在一个C源程序文件中所定义的全局变量,其作用域为( )。 A)由具体定义位置和e*tern说明来决定范围 B)所在程序的全部范围 C)所在函数的全部范围 D)所在文件的全部范围 正确答案: A 答疑: 【解析】全局变量的作用域是从声明处到文件的完毕。 所以选择A) 有以下程序: *include intfun() { staticint*=1; **=2; return*; } main() { inti,s=1; for(i=1;i<=3;i++)s*=fu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国计算机 二级 考试 语言 知识点