CC++语言程序设计笔试面试题23Word格式文档下载.docx
《CC++语言程序设计笔试面试题23Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《CC++语言程序设计笔试面试题23Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
运行的结果为什么等于15
#include"
stdio.h"
string.h"
voidmain()
charaa[10];
printf("
%d"
strlen(aa));
}
sizeof()和初不初始化,没有关系;
strlen()和初始化有关。
3。
给定结构structA
chart:
4;
chark:
unsignedshorti:
8;
unsignedlongm;
};
问sizeof(A)=?
给定结构
structA
//4位
//8位这里要偏移2字节保证4字节对齐
//4个字节
//共8字节
4。
分析一下
#include<
iostream.h>
#include<
string.h>
malloc.h>
stdio.h>
stdlib.h>
memory.h>
typedefstructAA
intb1:
5;
intb2:
2;
}AA;
AAaa;
charcc[100];
strcpy(cc,"
0123456789abcdefghijklmnopqrstuvwxyz"
memcpy(&
aa,cc,sizeof(AA));
cout<
<
aa.b1<
endl;
aa.b2<
-16和1
首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.
经过strcpy和memcpy后,aa的4个字节所存放的值是:
0,1,2,3的ASC码,即00110000,00110001,00110010,00110011
所以,最后一步:
显示的是这4个字节的前5位,和之后的2位
分别为:
10000,和01
因为int是有正负之分 所以是-16和1
5。
求函数返回值,输入x=9999;
intfunc(x)
{
intcountx=0;
while(x)
{
countx++;
x=x&
(x-1);
returncountx;
结果呢?
知道了这是统计9999的二进制数值中有多少个1的函数,且有
9999=9×
1024+512+256+15
9×
1024中含有1的个数为2;
512中含有1的个数为1;
256中含有1的个数为1;
15中含有1的个数为4;
故共有1的个数为8,结果为8。
1000-1=0111,正好是原数取反。
这就是原理。
用这种方法来求1的个数是很效率很高的。
不必去一个一个地移位。
循环次数最少。
6。
inta,b,c请写函数实现C=a+b,不可以改变数据类型,如将c改为longint,关键是如何处理溢出问题
booladd(inta,intb,int*c)
*c=a+b;
return(a>
0&
&
b>
(*c<
a||*c<
b)||(a<
b<
(*c>
a||*c>
b)));
7。
分析:
structbit
{inta:
3;
intb:
intc:
intmain()
bits;
char*c=(char*)&
s;
cout<
sizeof(bit)<
*c=0x99;
s.a<
endl<
s.b<
endl<
s.c<
inta=-1;
%x"
a);
return0;
输出为什么是?
4
1
-1
-4
ffffffff
因为0x99在内存中表示为10011001,a=001,b=11,c=100(在vc环境中,一般是由右到左进行分配的
)
当c为有符合数时,c=100,最高1为表示c为负数,负数在计算机用补码表示,所以c=-4;
同理
b=-1;
当c为有符合数时,c=100,即c=4,同理b=3
8。
改错:
intmain(void){
int**p;
intarr[100];
p=&
arr;
return0;
搞错了,是指针类型不同,
//二级指针
//得到的是指向第一维为100的数组的指针
应该这样写#include<
int**p,*q;
intarr[100];
q=arr;
q;
9。
下面这个程序执行后会有什么错误或者效果:
#defineMAX255
intmain()
unsignedcharA[MAX],i;
//i被定义为unsignedchar
for(i=0;
i<
=MAX;
i++)
A[i]=i;
死循环加数组越界访问(C/C++不进行数组越界检查)
MAX=255
数组A的下标范围为:
0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题..但是返回for(i=0;
i++)语句时,
由于unsignedchar的取值范围在(0..255),i++以后i又为0了..无限循环下去.
11。
structname1{
charstr;
shortx;
intnum;
structname2{
sizeof(structname1)=?
?
sizeof(structname2)=?
sizeof(structname1)=8,sizeof(structname2)=12
在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;
同时为保证整个结构的自然对齐(
这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。
1.写出判断ABCD四个表达式的是否正确,若正确,写出经过表达式中a的值(3分)
inta=4;
(A)a+=(a++);
(B)a+=(++a);
(C)(a++)+=a;
(D)(++a)+=(a++);
a=?
答:
C错误,左侧不是一个有效变量,不能赋值,可改为(++a)+=a;
改后答案依次为9,10,10,11
2.某32位系统下,C++程序,请计算sizeof的值(5分).
charstr[]=“”
char*p=str;
intn=10;
请计算
sizeof(str)=?
(1)//数组分配的内存是连续的
sizeof(p)=?
(2)//指针内存不连续,指针的大小为4
sizeof(n)=?
(3)/整形
voidFoo(charstr[100]){
sizeof(str)=?
(4)//数组作为参数传递时,传递的是数组的首地址,即指向第一个元素的指针
void*p=malloc(100);
(5)
(1)17
(2)4(3)4(4)4(5)4
4.回答下面的问题(6分)
(1).
VoidGetMemory(char**p,intnum){
*p=(char*)malloc(num);
voidTest(void){
char*str=NULL;
GetMemory(&
str,100);
strcpy(str,"
printf(str);
请问运行Test函数会有什么样的结果?
输出“hello”
(2).
char*str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!
=NULL){
strcpy(str,“world”);
输出“world”,因为free(str)后并未改变str所指的内存内容。
(3).
char*GetMemory(void){
charp[]="
helloworld"
;
returnp;
str=GetMemory();
无效的指针,输出不确定
5.编写strcat函数(6分)
已知strcat函数的原型是char*strcat(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcat
VC源码:
char*__cdeclstrcat(char*dst,constchar*src)
char*cp=dst;
while(*cp)
cp++;
/*findendofdst*/
while(*cp++=*src++);
/*Copysrctoendofdst*/
return(dst);
/*returndst*/
(2)strcat能把strSrc的内容连接到strDest,为什么还要char*类型的返回值?
方便赋值给其他变量
6.MFC中CString是类型安全类么?
不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换
7.C++中为什么用模板类。
(1)可用来创建动态增长和减小的数据结构
(2)它是类型无关的,因此具有很高的可复用性。
(3)它在编译时而不是运行时检查数据类型,保证了类型安全
(4)它是平台无关的,可移植性
(5)可用于基本数据类型
8.CSingleLock是干什么的。
同步多个线程对一个数据类的同时访问
9.NEWTEXTMETRIC是什么。
物理字体结构,用来设置字体的高宽大小
10.程序什么时候应该使用线程,什么时候单线程效率高。
1.耗时的操作使用线程,提高应用程序响应
2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3.多CPU系统中,使用线程提高CPU利用率
4.改善程序结构。
一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程
序会利于理解和修改。
其他情况都使用单线程。
11.Windows是内核级线程么。
见下一题
12.Linux有内核级线程么。
线程通常被定义为一个进程中代码的不同执行路线。
从实现方式上划分,线程有两种类型:
“用户级线程”
和“内核级线程”。
用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进
程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
这种线程甚至在象DOS这样的操作系统
中也可实现,但线程的调度需要用户程序完成,这有些类似Windows3.x的协作式多任务。
另外一种则需要内核
的参与,由内核完成线程的调度。
其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有
其好处和缺点。
用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用
的要求,但是当一个线程因I/O而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到
运行的机会;
而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。
WindowsNT和OS/2支持内核线程。
Linux支持内核级的多线程
13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?
栈:
存放局部变量,函数调用参数,函数返回值,函数返回地址。
由系统管理
堆:
程序运行时动态申请,new和 malloc申请的内存就在堆上
近堆还是远堆不是很清楚。
14.使用线程是如何防止出现大的波峰。
意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使
用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。
15函数模板与类模板有什么区别?
函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显
式地指定。
16一般数据库若出现日志满了,会出现什么情况,是否还能使用?
只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。
也就是说基本上
处于不能使用的状态。
17SQLServer是否支持行级锁,有什么好处?
支持,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性,行级
封锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。
因而行级锁即可保证数据的一
致性又能提高数据操作的迸发性。
18如果数据库满了会出现什么情况,是否还能使用?
见16
19关于内存对齐的问题以及sizof()的输出
编译器自动对齐的原因:
为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原
因在于,为了访问未对齐的内存,处理器需要作两次内存访问;
然而,对齐的内存访问仅需要一次访问。
20inti=10,j=10,k=3;
k*=i+j;
k最后的值是?
60,此题考察优先级,实际写成:
k*=(i+j);
,赋值运算符优先级最低
21.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?
将操作多个表的操作放入到事务中进行处理
22.TCP/IP建立连接的过程?
(3-wayshake)
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:
建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即
SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端
和服务器进入ESTABLISHED状态,完成三次握手。
23.ICMP是什么协议,处于哪一层?
Internet控制报文协议,处于网络层(IP层)
24.触发器怎么工作的?
触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,
数据库就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。
25.winsock建立连接的主要实现步骤?
服务器端:
socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。
客户端:
socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据
,直至数据交换完毕,closesocket()关闭套接字。
accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。
该新产生的套接字使
用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。
26.动态连接库的两种方式?
调用一个DLL中的函数有两种方法:
1.载入时动态链接(load-timedynamiclinking),模块非常明确调用某个导出函数,使得他们就像本地函数
一样。
这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
2.运行时动态链接(run-timedynamiclinking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL
DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用
DLL函数了。
如此即可避免导入库文件了。
27.IP组播有那些好处?
Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧消
耗和网络拥挤问题。
组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同
时的)的网络技术。
组播可以大大的节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上
只传送单一的数据包。
所以说组播技术的核心就是针对如何节约网络资源的前提下保证服务质量。