以下是小编精心整理的C语言笔试系列题目收集(共含9篇),希望对大家有所帮助。同时,但愿您也能像本文投稿人“mrss7leo”一样,积极向本站投稿分享好文章。
C语言笔试系列题目收集分享
1. 下列区域存取速度最快的是(c)
A. Flash B. DRAM C. CACHE D. 磁盘
2. 哪些区域不能用来存储变量空间
A. SDRAM B. CACHE(一、二级缓存) C. DDR2 D. L2SRAM DATA
3. CPU中数据总线的宽度会影响(d)
A. 内存容量大小 B. 系统运算速度 C.指令系统指令数量 D.寄存器宽度
4. 不能提高代码执行效率的`是(cd)
A. 多循环减少内循环的次数 B. 将频繁调用的小函数改为内联函数
C. 使用递归函数 D. 提高并行性 E. 减少存储器引用
5. 中断响应时间是指(d)
A. 从中断处理开始,到中断处理结束的时间 B. 从中断请求开始,到中断处理结束的时间
C. 从中断请求开始,到中断处理开始的时间 D. 从发出中断请求到进入中断处理所用的时间
1. 填写下面程序输出
#include
main()
{
int a[5] = {1, 2, 3, 4, 5};
int * ptr = (int*)(&a + 1);注意
printf(“%d %d”, *(a + 1), *(ptr - 1));
}
输出是____2 5_________;
2. 填写下面程序输出
#include
main()
{
char p;
char buf[10] = {1, 2, 3, 4, 5, 6, 9, 8};
p = (buf+1)[5];
printf(“%d”, p);
}
输出是_____9________;
3. 以下变量和函数存储在ELF可重定位目标的哪些段总,请在注释中写上段名,
int valid; // __________
int last = -1; // __________
int tophat(int size, double brim_width); // __________
printf(“How's your exam going?n”); // __________
(此题记忆不完整!)
1. 写分配空间的程序void * getmm(int size, int align),分配size大小的空间,并根据align指定的字节数方式对齐。
2. 完成统计灰度图像直方图的函数void getHist(unsigned char * img, hist[], int width, int hEight, int strip);其中,img为图像首地址,strip为每行首地址距离下一行首地址的偏移量。图像元素值为0-255,hist[]返回图像直方图。
int i,j;
//直方图数组清0
for(i=0;i<256;i++)
m_histArray[i]=0;
//每行像素所占字节数
int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;
//中间变量
int temp;
//统计灰度直方图
for(i=0;i
for(j=0;j
temp=*(m_pImgData+i*lineByte+j);
m_histArray[temp]++;
一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)算法的空间复杂度是指________。
A)算法程序的长度 B)算法程序中的指令条数
C)算法程序所占的存储空间 D)算法执行过程中所需要的存储空间
答案:D
评析:一个算法的空间复杂度,一般是指执行这个算法所需的内存空间。
一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。
(2)下列关于栈的叙述中正确的是________。
A)在栈中只能插入数据 B)在栈中只能删除数据
C)栈是先进先出的线性表 D)栈是先进后出的线性表
答案:D
评析:栈是限定在一端进行插入与删除的线性表。
栈是按照“先进后出”的或“后进先出”的原则组织数据的,因此,栈也被称为“先进后出”表或“后进先出”表。
(3)在深度为5的满二叉树中,叶子结点的个数为________。
A)32 B)31 C)16 D)15
答案:C
评析:所谓满二叉树是指除最后一层外,每层上的所有结点都有两个子结点。也就是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第K层上有2K-1个结点,且深度为m的满二叉树有2m个结点。
在满二叉树中,最后一层的结点个数就是叶子结点的个数,本题中深度为5,故叶子结点数为25-1=24=16。
(4)对建立良好的程序设计风格,下面描述正确的是________。
A)程序应简单、清晰、可读性好 B)符号名的命名要符合语法
C)充分考虑程序的执行效率 D)程序的注释可有可无
答案:A
评析:要形成良好的程序设计风格,主要应注重和考虑下述一些因素:符号名的命名应具有一定的实际含义,以便于对程序功能的理解;正确的注释能够帮助读者理解程序;程序编写应优先考虑清晰性,除非对效率有特殊要求,程序编写要做到清晰第一,效率第二。
(5)下面对对象概念描述错误的是________。
A)任何对象都必须有继承性 B)对象是属性和方法的封装体
C)对象间的通讯靠消息传递 D)操作是对象的动态性属性
答案:A
评析:对象是由数据和容许的操作组成的封装体,与客观实体有直接的对应关系。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。
(6)下面不属于软件工程的3个要素的是________。
A)512具 B)过程 C)方法 D)环境
答案:D
评析:软件工程包括3个要素,即方法、工具和过程。
(7)程序流程图(PFD)中的箭头代表的是________。
A)数据流 B)控制流 C)调用关系 D)组成关系
答案:B
评析:程序流程图(PFD)是一种传统的、应用广泛的软件过程设计表示工具,通常也称为程序框图,其箭头代表的是控制流。
(8)在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶 段。其中数据独立性最高的阶段是________。
A)数据库系统 B)文件系统 C)人工管理 D)数据项管理
答案:A
评析:在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。其中数据独立性最高的阶段是数据库系统。
(9)用树形结构来表示实体之间联系的模型称为________。
A)关系模型 B)层次模型 C)网状模型 D)数据模型
答案:B
评析:层次模型是最早发展出来的数据库模型。它的基本结构是树形结构,这种结构方式在现实世界中很普遍,如家族结构、行政组织机构,它们自顶向下、层次分明。
(10)关系数据库管理系统能实现的专门关系运算包括________。
A)排序、索引、统计 B)选择、投影、连接
C)关联、更新、排序 D)显示、打印、制表
答案:B
评析:关系数据库管理系统能实现的专门关系运算,包括选择运算、投影运算、连接运算。
(11)下列语句中符合C语言语法的赋值语句是________。
A)aC7+b+cCa+7 B)a=a+7
C)a=7+b,b++,a+7; D)a=7+b,c=a十7;
答案:D
评析:由于赋值语句是由赋值表达式加分号构成,所以选项A、B均不是合法的赋值语句;选项c中,存在两种运算符:逗号运算符和赋值运算符,其中赋值运算符的优先级高,选项c也不是。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是c语言笔试题目及答案,请参考。
c语言笔试题目及答案
一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选
项涂写在答题卡相应位置上,答在试卷上不得分。
(1)数据的存储结构是指________。
A)存储在外存中的数据 B)数据所占的存储空间量
C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示
答案:D
评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。
(2)下列关于栈的描述中错误的是________。
A)栈是先进后出的线性表
B)栈只能顺序存储
C)栈具有记忆作用
D)对栈的插入与删除操作中,不需要改变栈底指针
答案:B
评析:栈是一种特殊的线性表,又称先进后出表(FILO―First In Last Out)。
(3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是
________。
A)冒泡排序为n2 B)冒泡排序为n
C)快速排序为n D)快速排序为n(n一1)/2
答案:D
评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。
(4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。
A)log2n B)n/2 C)n D)n+l
答案:C
评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。
(5)下列对于线性链表的描述中正确的是________。
A)存储空间不一定是连续,且各元素的存储顺序是任意的
B)存储空间不一定是连续,且前件元素一定存储在后件元素的前面
C)存储空间必须连续,且前件元素一定存储在后件元素的前面
D)存储空间必须连续,且各元素的存储顺序是任意的
答案:A
评析:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
(6)下列对于软件测试的描述中正确的是________。
A)软件测试的目的是证明程序是否正确
B)软件测试的目的是使程序运行结果正确
C)软件测试的目的是尽可能多地发现程序中的错误
D)软件测试的目的是使程序符合结构化原则
答案:C
评析:关于软件测试的目的,Grenford J.Myers再《The Art of Software Testing》一书中给出了深刻的阐述,整体来说,软件测试的目的就是尽可能多地发现程序中的错误。
(7)为了使模块尽可能独立,要求________。
A)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强
B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱
C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱
D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强
答案:B
评析:模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。软件设计,应尽量做到高内聚,低耦合,有利于提高模块的独立性。
(8)下列描述中正确的是________。
A)程序就是软件
B)软件开发不受计算机系统的限制
C)软件既是逻辑实体,又是物理实体
D)软件是程序、数据与相关文档的集合
答案:D
评析:计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。
(9)数据独立性是数据库技术的重要特点之一,所谓数据独立性是指________。
A)数据与程序独立存放
B)不同的数据被存放在不同的文件中
C)不同的数据只能被对应的应用程序所使用
D)以上三种说法都不对
答案:D
评析:数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。选项A、B、C三种说法都是错误的。
(10)用树形结构表示实体之间联系的模型是________。
A)关系模型 B)网状模型 C)层次模型 D)以上三个都是
答案:C
评析:层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。
(11)算法具有五个特性,以下选项中不属于算法特性的是________。
A)有穷性 B)简洁性 C)可行性 D)确定性
答案:B
评析:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的基本特性。
(12)以下选项中可作为C语言合法常量的是________。
A)-80. B)-080 C)-8e1.0 D)-80.0e
答案:A
评析:c语言的常量分为整型常量、实型常量和字符型常量。选项A属于实型常量中的十进制小数形式的表示法,是合法的。
(13)以下叙述中正确的是________。
A)用C程序实现的算法必须要有输入和输出操作
B)用C程序实现的算法可以没有输出但必须要输入
C)用C程序实现的算法可以没有输入但必须要有输出
D)用C程序实现的算法可以既没有输入也没有输出
答案:C
评析:算法的特性中包括“有零个或多个输入”及“有一个或多个输出”这两个特性。一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。
(14)以下不能定义为用户标识符的是________。
A)Main B)_0 C)_int D)sizeof
答案:D
评析:C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。注意:大写字母和小写字母被认为是两个不同的字符。A中Main与主i函数名main不同。
(15)以下选项中不能作为合法常量的是________。
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
答案:B
评析:指数形式的实型常量要求字每e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。
(16)数字字符0的ASCII值为48,若有以下程序
main
{char a=”1″,b=”2″;
printf(“%c,”,b++);
printf(“%d ”,b-a);
)
程序运行后的输出结果是________。
A) 3,2 B)50,2 C)2,2 D)2,50
答案:C
评析l执行语句“printf(“%c,ll,b++);”后,b的值变成字符3,执行“printf(“%d ”,b-a);”,即‘3’-‘1’。
(17)有以下程序
main( )
{
int m=12, n=34;
printf(“%d%d”,m++,++n);
printf(“%d%d ”,n++,++m);
}
程序运行后的输出结果是________。
A)12353514 B)12353513 C)12343514 D)12343513
答案:A
评析:执行“printf(“%d%d”m++,++n);”后,输出的是m和n+l的值1235,接着执行
“printf(“%d%d\n”,n++,++m);”输出n和m+l的值3514。
(18)有定义语句:int b;char c[10】;,则正确的输入语句是________。
A) scanf(“%d%s”,&b,&C); B) scanf(“%d%s”,&b,C);
C) scanf(“%d%s”,b,C); D) scanf(“%d%s”,b,&C);
答案:B
评析:scanf函数中的“格式控制”后面应当是地址,而不是变量名。对于变量,通过地址运算符“&”求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。
(19)有以下程序
main()
{int m,n,p;
scanf(“m=%dn=%dp=%d”,&m,&n,&p);
printf(“%d%d%d\n”,m,n,p);
}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,
则正确的输入是________。
A) m。123n=456p=789 B) m=123 n=456 p=789
C) m=123,n=456,p=789 D) 123 456 789
答案:A
评析:根据本题的数据输入形式“scanf(“m=%dn=%dp=%d”&m,&n,&p);”说明在输入数据时,必须输入“m=”、“n=”、“p=”字符,且中间不能含有空格。
(20)有以下程序
main()
{ int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf(”%d,%d\n”,a,b);
}
程序运行后的输出结果是________。
A)6,l B)2,l C)6,0 D)2,0
答案:B
评析:本题中“a=d/10%9;”的值为25/10%9=2; “b=a&&(-1);”为2&&(-1)=1(注意:-1表示真,只有O才表示假),所以a,b的值分别为2,1。
(21)有以下程序
main()
{
int i=1 j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf(“%d%d%d\n”,i,j,k);
}
程序运行后的输出结果是________。
A)l 2 3 B)2 34 C) 2 2 3. D)2 3 3
答案:D
评析:执行“i++==1&&(++j==3‖k++==3)”时,表达式“i++==1”嗨值为真,其值为1,表达式“++j=3”的值为真,根据短路原理,右边的表达式“k++==3”不再进行运算。括号中表达的值为l,作与运算后整个表达式的值也为l,输出i.j,k时,由于未执行过k,所以它们的值分别为2,3,3。
(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a
A)l B)2 C)3 D)4
答案:A
评析:条件表达式的一般形式为:表达式17表达式2:表达式3
本题先求的是a
(23)有以下程序
main( )
{
int p[8]={11,12,13,14,15,16,17,18},i=O,j=0;
while(i++<7)if p[i]%2)j+-=p[i];
printf(“%d\n”,j);
}
程序运行后的输出结果是________。
A)42 B)45 C)56 D)60
答案:B
评析:本程序的作用是求除p[O]外的其它奇数的和。
(24)有以下程序
main()
{
char a[7]= “a0\OaO\0”; int i,j;
i=sizeof(a);j=strlen(a);
printf(“%d%d\n”,i,j);
)
程序运行后的输出结果是________。
A)2 2 B)76 C)7 2 D)6 2
答案:C
评析:c语言中以‘\0’作为字符串的结束符,且strlen()函数计算的是‘\0’字符前的所有字符的个数。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。
(25)以下能正确定义一维数组的选项是________。
A)int a[5]={0,1,2,3,4,5; B)char a[]={0,1,2,3,4,5};
C)char a={’A’,’B’,’C’}; D)int a[5]=”0123″;
答案:B
评析:选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;选项c不符合数组定义形式,数组名后应加上“[]”;选项D的类型说明符错误,如果用char定义就对了;选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。
(26)有以下程序
int fl(int x,int y){return x>y?x:y;}
int f2(int x,int y){return x>y?y:x;}
main()
{
int a=4,b=3,c=5,d=2,e,f,g;
e=f2(f1(a,b),f1(c,d));f=fl(f2(a,b),f2(c,d));
g=a+b+c+d-e-f;
printf(“%d,%d,%d\n”,e,f,g);
)
程序运行后的输出结果是________。
A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,7
答案:A
评析:函数n的功能是返回两个数中比较大的值,f2的功能是返回两个数中比较小的值。
(27)已有定义:char a[]=”xyz”,b[]={’x’,’y’,’z};,以下叙述中正确的是________。
A)数组a和b的长度相同 B)a数组长度小于b数组长度
C)a数组长度大于b数组长度 D)上述说法都不对
答案:C
评析:c语言规定‘\0’为字符串结束标志。所以“char a[]=“xyz””的数组长度为4,而“b[]={‘x’,‘y’,‘z’};”的数组长度为3,数组长度与strlen函数所求的长度不同,本题是指数组占内存空间的大小。
(28)有以下程序
Void f(int *x, int *y)
{
int t;
t= *x; *x=*y;’*y=t;
)
main( )
{
int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a[7];
while(p {f(p,q); p++; qC;} 。 for(i=0;i<3;i++) printf(“%d”,a[1][i]); } 程序运行后的输出结果是________。 A)8,2,3,4,5,6,7,1, B)5,6,7,8,1,2,3,4. C)1,2,3,4,5,6,7,8, D)8,7,6,5,4,3,2,l, 答案:D 评析;本程序中函数f的作用是交换指针变量x和y所指向的存储单元的值。 (29)有以下程序 main() { im a[3][3],*p,i; p=&a[0][o]; for(i=0;j<9;i++) p[i]=I; for(i=0;j<3;i++)printf(“%d”,a[1][i]); ) 程序运行后的输出结果是________。 A)012 B)123 C)234 D)345 答案:D 评析:本题赋值后,a的数组元素的值分别为a[01[0]=0,a[0][1]=1,a[0][2]=2,a[1][0]=3,a[1][1]=4,a[1][2]=5,a[2][0]=6,a[2][1]=7,a[2][2]=8,故本题输出的值为345。 (30)以下叙述中错误的是________。 A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B)数组名代表的是数组所占存储区的首地址,其值不可改变 C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越 界”的出错信息 D)可以通过赋初值的方式确定数组元素的个数 答案:C 评析:在c语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出“下标越界”的错误提示。 (31)有以下程序 #define N20 fun(int a[],int n,int m) { int i,j; for(i=m;i>=n;iC)a[i+1]=a[i]; } main() { int i,a[N]={1,2,3,4,5,6,7,8,9,10}; fun(a,2,9); for(i=O;i<5;i++) printf(“%d”,a[i]); } 程序运行后的输出结果是________。 A)10234 B)12344 C)12334 D)12234 答案:C 评析:本题函数fun的作用是将指定的数组元素(从下标n到下标m)向后移一位。由函数调用“fun(a,2,9);”可知,函数fun用于将a[2]到a[9]的各元素依次向后移一位,移完后,a数组中各元素的值分别为1,2,3,3,4,5,6,7,8,9,10,故输出的前5个数组元素为12334。 (32)有以下程序 main() { int a[3][2]={0},(*ptr)[2],i,j; for(i=0;i<2;i++) {ptr=a+i; scanf(“%d”,ptr); ptr++;} for(i=0;i<3;i++) { for(i=0;j<2;j++) printf(“%2d”,a[i][j]); printf(“\n”); } } 若运行时输入:1 2 3<回车>,则输出结果是________。 A)产生错误信息 B)l0 C)l 2 D)l 0 2 O 3 0 2 0 0 0 0 O 3 0 答案:B 评析:二维数组a,通过a[3][2]={0}将数组中的各个元素初始化为0,指针变量ptr,指向包含2个元素的一维数组。a[0][0]:l,a[1][0]=2,故本题的输出选B。 (33)有以下程序 prt(int *m, int n) { int i; for(i=O;i ) main() { int a[]={ 1,2,3,4,5 },i; prt(a,5); for(i=O;i<5;i++) printf(“%d,”,a[i]); 程序运行后的输出结果是________。 A)l,2,3,4,5, B)2,3,4,5,6, C)3,4,5,6,7, D)2,3,4,5,1, 答案:B 评析:用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共同占用同一段内存单元。 (34)有以下程序 main() { int a[]={1,2,3,4,5,6,7,8,9,0},*p; for(p=a;p } 程序运行后的输出结果是________。 A)l,2,3,4,5,6,7,8,9,0, B)2,3,4,5,6,7,8,9,10,1, C)0,1,2,3,4,5,6,7,8,9, D)l,l,1,l,l,l,l,l,l,l, 答案:A 评析:c语言规定数组变量名代表数组的首地址,即第0号元素的地址。本题将a数组中的值全部输出,即为l,2,3,4,5,6,7,8,9,0,。 (35)有以下程序 #define P 3 void F(int x){return(P*x*x);} main() {printf(“%d\n”,F(3+5));} 程序运行后的输出结果是________。 A)192 B)29 C)25 D)编译出错 答案:D 评析:return语句用于从被调函数带回一个函数值。void关键字表示“无类型”,即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。 (36)有以下程序 main() {int c=35;printf(“%d\n”,c&C);} 程序运行后的输出结果是________。 A)0 B)70 C)35 D)1 答案:C 评析:按位“与”时,1&1=1,其他都等O。因为本题中相与的两个值相等,即对应位上的二进制值相等,所以“与”的结果也即为其值本身。 (37)以下叙述中正确的是________。 A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示 D)宏替换不占用程序的运行时间 答案:D 评析:通常,预处理命令位于源文件的开头,也可以写在函数与函数之间;不能在一行上写多条预处理命令:宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。 (38)若有以下说明和定义 union dt {int a;har b;ouble c;}data; 以下叙述中错误的是________。 A)data的每个成员起始地址都相同 B)变量data所占的内存字节数与成员c所占字节数相等 C)程序段:data.a=5;pintf(“%f ”,data.C);输出结果为5.000000 D)data可以作为函数的实参 答案:C 评析:union是表示共用体的关键字,成员a,b,c共占用同一个内存空间,data的每个成员起始地址都相同;共用体变量所占的内存长度等于最长的成员的长度,故变量’data所占的内存字节数与成员c所占字节数相等;执行“data.a=5;printf(“%f ”,data.C);”printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。 (39)以下语句或语句组中,能正确进行字符串赋值的是________。 A)char*sp;*sp=”right!”; B)char s[lO];s=”right! “; C)char s[10];*s=”right! “; D)char*sp=”right! “; 答案:D 评析:选项A定义了字符型的指针变量sp,则*sp存储的是第一个字符,而给它赋的是字符串,故错; 选项B表示代表数组的首地址,而题中给它赋的是字符串,所以错误; 选项c定义了一个字符型的数组s[10],再通过+s给数组元素赋初值,这时是与选项A相同的错误。 (40)设有如下说明 typedef struct ST {long a; int b; char c[2];}NEW; 则下面叙述中正确的是________。 A)以上的说明形式非法 B)ST是一个结构体类型 C)NEW是一个结构体类型 D)NEW是一个结构体变量 答案:C 评析:typedef关键字用于声明一个新的类型名代替已有的类型名。 本题中如果没有用typedef进行定义的话,则struct ST为结构体类型,现在用typedef定义后,相当于用NEW代表了struct ST这一结构体类型,故NEW为结构体类型。 (41)有以下程序 main() { int a=1,b; for(b=l;b<10;b++) { if(a>=8)break; if(a%2==1){a+=5;continue;} a-=3; ) printf(“%d\n”,b); } 程序运行后的输出结果是________。 A) 3 B)4 C) 5 D) 6 答案:B 评析:break和continue的区别是:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,.不再判断执行的条件是否成立。 (42)有以下程序 main() { char s[]=”l 59″,*p; p=s; printf(“%c”,*p++);printf(“%c”,*p++); } 程序运行后的输出结果是________。 A)15 B)16 C)12 D)59 答案:A 评析:本题通过“p=s”将指针变量p指向字符数组s,在第一次输出时,由于++和*为同一优先级,“*p++”相于“+(p++)”。p指向s[1],输出为s[1]的值。 [c语言笔试题目及答案] C语言软件开发笔试题目 (1)什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种 情况下,可以将所有包含文件预编译为一个预编译头。 预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令吗,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的.操作,可以放在程序中的任何位置。c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译。 (2)char* const p, char const* p,const char*p 上述三个有什么区别? 答案: char * const p; //常量指针,p 的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p;//和char const *p等价 (3)char str1[] = “abc”; char str2[] = “abc”; const char str3[] = “abc”; const char str4[] = “abc”; const char *str5 = “abc”; const char *str6 = “abc”; char *str7 = “abc”; char *str8 = “abc”; cout < <( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl; 结果是:0 0 1 1 str1,str2,str3,str4 是数组变量,它们有各自的内存空间;而str5,str6,str7,str8 是指针,它们指向相同的常量区域, (4)以下代码中的两个sizeof 用法有问题吗? void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 { for( size_t i=0;i if( 'a' <=str[i] && str[i] <='z' ) str[i] -= ('a'-'A' ); } char str[] = “aBcDe”; cout < < “str 字符长度为: ” < < sizeof(str)/sizeof(str[0]) < < endl; UpperCase( str ); cout < < str < < endl; 答案:函数内的sizeof 有问题。根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str 是一个静态定义的数组,因此其大小为6,因为还有' ',函数内的str 实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof 作用于上只将其当指针看,一个指针为4 个字节,因此返回4。 (5)一个32 位的机器,该机器的指针是多少位答案: 指针是多少位只要看地址总线的位数就行了。80386 以后的机子都是32 的数据总线。所以 指针的位数就是4 个字节了。 1.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数; 答:char *strcpy(char *strDest, const char *strSrc) { if ( strDest == NULL || strSrc == NULL) return NULL ; if ( strDest == strSrc) returnstrDest ; char *tempptr = strDest ; while( (*strDest++ = *strSrc++) != ‘’); returntempptr ; } 2. 头文件中的ifndef/define/endif的作用? 答:防止该头文件被重复引用。 3. #i nclude与#i nclude “file.h”的区别? 答:前者编译器从标准库路径开始搜索file.h,而后者编译器从用户的工作路径开始搜索file.h。 4. 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern“C”? 答:extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。 5. 面向对象的三个基本特征,并简单叙述之? 答:1)封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public) 2)继承:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。 3)多态:允许将子类类型的指针赋值给父类类型的指针。 1.变量的声明和定义有什么区别? 答:声明变量不分配空间,定义变量要分配空间。声明主要是告诉编译器,后面的引用都按声明的格式。定义其实包含了声明的意思,同时要分配内存空间。 2. 解释堆和栈的区别。 答:堆(heap)——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。速度比较慢,而且容易产生内存碎片,不过用起来最方便。 栈(stack)——由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。由系统自动分配,速度较快。但程序员是无法控制的。 3. const的作用是什么? 答:(1)可以定义const常量 (2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 4. 下列哪两个是等同的 int b; A constint* a = &b; //指向常量的指针,不能通过指针改变b,但指针的地址可以改变。 B const* int a = &b;// 指针的地址不可以改变,但可以通过指针改变b的值 C constint* const a = &b; //指针指向的值,和指针本身的地址都不能改变 D intconst* const a = &b;//与c相同 5. 完成程序,实现对数组的降序排序 #include void sort(int array ); int main { int array={45,56,76,234,1,34,23,2,3}; //数字任//意给出 sort( array ); return 0; } void sort( int array ) {____________________________________ inti,j,k; for(i=1;i<=7;i++) { if(array[i]>array[i-1]) { k=ARRAY[i]; j=i-1; do { array[j+1]=array[j]; j– ; } while(k>array[j]&&j>=0); array[j+1]=k; } } —————————————————– } 6. int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少? 答:相当于 i=j=4;i=k=8;i=l=16;i=m=32; 故最后i=32; 1. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别? 答:从定义上来说: 重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 重写:是指子类重新定义复类虚函数的方法。 从实现原理上来说: 重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。 重写:当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。 2. 多态的作用? 答:主要是两个:1)隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2)接口重用,为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。 3. 分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。 答:BOOL :if ( !a ) or if(a) int :if ( a ==0) float :const EXPRESSION EXP = 0.000001 if ( a < EXP && a >-EXP) pointer : if ( a != NULL) or if(a == NULL) 4. 请说出const与#define 相比,有何优点? 答案:1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。 5.简述数组与指针的区别? 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。 (1)修改内容上的差别 char a = “hello”; a[0] = ‘X’; char *p = “world”; // 注意p 指向常量字符串 p[0] = ‘X’; // 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 char a = “hello world”; char *p = a; cout< cout< 计算数组和指针的内存容量 voidFunc(char a[100]) { cout< } 1.求下面函数的返回值( 微软) int func(x) { int countx =0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999。 答案:8 思路:将x转化为2进制,看含有的1的个数。 2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。 3. 将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。 (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。 (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。 4. 在什么时候需要使用“常引用”? 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名; 例1 int a; constint&ra = a; ra = 1; // 错误 a = 1; // 正确 例2 string foo( ); void bar(string&s) // 那么下面的表达式将是非法的: bar(foo( )); bar(“hello world”); 原因在于foo( )和“hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。 引用型参数应该在能被定义为const的情况下,尽量定义为const 。 5. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则? 格式: 类型标识符 &函数名(形参列表及类型说明) { //函数体 } 好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用(这个要注意啦,很多人没意识到,哈哈。。。)。 这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。 (3)可以返回类成员的引用,但最好是const。 这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。 (4)流操作符重载返回值申明为“引用”的作用: 流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout <<“hello” << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。 因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。 赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。 例3 #include int&put(int n); int vals[10]; int error = -1; void main { put(0) = 10; // 以put(0)函数值作为左值,等价于vals[0]=10; put(9) = 20; // 以put(9)函数值作为左值,等价于vals[9]=20; cout << vals[0]; cout << vals[9]; } int&put(int n) { if (n>=0&& n<=9 ) { return vals[n]; } else { cout << “subscript error”; return error; } } (5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一 个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。 6. “引用”与多态的关系? 引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例(见:C++中类的多态与虚函数的使用)。 例4 Class A; Class B : Class A { // ... }; B b; A&ref= b; 7. “引用”与指针的区别是什么? 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差; 而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。 8. 什么时候需要“引用”? 流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 9. 结构与联合有和区别? 1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。 10. 下面关于“联合”的题目的输出? a) #include union { int i; char x[2]; }a; void main { a.x[0] =10; a.x[1] =1; printf(“%d”,a.i); } 答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A) b) main { union{ /*定义一个联合*/ int i; struct{ /*在联合中定义一个结构*/ char first; char second; }half; }number; number.i=0x4241; /*联合成员赋值*/ printf(“%c%cn”, number.half.first, mumber.half.second); number.half.first='a'; /*联合中结构成员赋值*/ number.half.second='b'; printf(“%xn”,number.i); getch; } 答案: AB (0x41对应'A',是低位;Ox42对应'B',是高位) 6261 (number.i和number.half共用一块地址空间) 1.求下面函数的返回值(微软) int func(x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999。 答案:8 思路:将x转化为2进制,看含有的1的个数。 2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。 3. 将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。 (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。 (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。 4. 在什么时候需要使用“常引用”? 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名; 例1 int a ; const int &ra=a; ra=1; //错误 a=1; //正确 例2 string foo( ); void bar(string & s); 那么下面的表达式将是非法的: bar(foo( )); bar(“hello world”); 原因在于foo( )和“hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。 引用型参数应该在能被定义为const的情况下,尽量定义为const 。 ★ 笔试题目 ★ 太古笔试题目 ★ 出纳笔试题目 ★ C笔试题目 ★ Dell笔试题目 ★ 广本笔试题目 ★ 飞利浦笔试题目 ★ 工行笔试题目 ★ 机械设计笔试题目 ★ 网站笔试题目篇4:C语言软件开发笔试题目
篇5:C/C笔试题目
篇6:C/C笔试题目
篇7:C/C笔试题目
篇8:C笔试题目
篇9:c笔试题目