设为首页 加入收藏

TOP

2013年微软暑期实习生笔试试题详解(一)
2014-11-23 20:07:46 来源: 作者: 【 】 浏览:96
Tags:2013年 微软 暑期 实习生 笔试 试题 详解


1、下列描述正确的是(A、B、C)


A、const int a; //const integer


B、int const a; //const integer


C、int const *a; //常量指针


D、const int * a; //常量指针


E、int const * a; //指针常量


解析:const int 和int const是一样的


常量指针和指针常量,前一个词是修饰语,后一个词是中心语。


常量指针即常量的指针,是指向常量的指针,其所指向的内容不能变;


指针常量即指针的常量,本身是一个常量,不能对其赋值。


在*前加const为常量指针,在*后加const为指针常量。



2、如下程序输出什么?


#include



using namespace std;



class A


{


public:


virtual void f()


{


cout<<”A::f()”<

}


void f()const


{


cout<<”A::f()Const”<

}


};



class B:public A


{


public:


virtual void f()


{


cout<<”B::f()”<

}


void f()const


{


cout<<”B::f()Const”<

}


};



void g(const A *a)


{


a->f();


}



int main()


{


A * a= new B();


a->f();


g(a);


system(“pause”);


return 0;


}


正确答案:



3、What is the difference between a linked list and an array (A、B、C、D)


A、Search complexity when both are sorted


B、Dynamicly and and remove


C、Random Access Efficiency


D、Data storage type


4、关于进程和线程的说法(C)


A、操作系统中的每一个应用程序必须有一个进程,但不必有进程


B、一个进程可以有自己的堆栈,但是线程只能和进程共享堆栈


C、线程必须隶属于一个进程


D、线程可以改变它所属于哪个进程


简而言之,一个程序至少有一个进程,一个进程至少有一个线程.


线程的划分尺度小于进程,使得多线程程序的并发性高。


另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。


线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。


从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。



进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.


线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.


一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.



线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态



进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。


5、如下程序输出什么?


int main()


{


int mx=10,my=10;


mx=mx++;


my=++my;


cout<

system(“pause”);


return 0;


}


输出:11 11


扩展阅读:


考点:i++和++i的效率比较。


出现频率:★★★


解析:


简单的比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。首先考虑内建数据类型的情况:如果自增运算表达式的结果没有被适用,而是仅仅简单地用于增加一元操作数,答案是明确的,前缀法和后缀法没有任何区别。编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异。


示例程序如下。



1 #include


2


3 int main()


4 {


5 int i=0;


6 int x=0;


7


8 i++;


9 ++i;


10 x=i++;


11 x=++I;


12


13 return 0;


14 }



上面的代码在VISUAL C++6.0上编译得到的汇编如下:


;Line 5


mov DWORD PTR_i$[dbp],0


; Line 6


mov DWORD PTR_i$[dbp],0


; Line 8


mov eax,DWORD PTR_i$[ebp]


add eax,1


mov DWORD PTR_i$[ebp],eax


; Line 9


mov eax,DWORD PTR_i$[ebp]


add eax,1


mov DWORD PTR_i$[ebp],eax


; Line 10


mov edx,DWORD PTR_i$[ebp]


mov DWORD PTR_x$[ebp],edx


mov eax,DWORD PTR_i$[ebp]


add eax,1


mov DWORD PTR_i$[ebp],eax


; Line 11


mov edx,DWORD PTR_i$[ebp]


add eax,1


mov DWORD PTR_x$[ebp],edx


mov eax,DWORD PTR_i$[ebp]


mov DWORD PTR_i$[ebp],eax



■ 代码段第8行和第9行生成的汇编代码分别对应Line8和Line9下面的汇编代码,可以看到3个步骤几乎完全一样。


■ 代码段第10行和第11行生成的汇编代码分别对应Line10和Line11下面的汇编代码,可以看到都是5个步骤,只是在加1的先后顺序上有一些区别,效率也是完全一样的。


由此说明,考虑内建数据类型时,它们的效率差别不大(取出编译器优化的影响)。再考虑自定义数据类型(主要是指类)的情况。此时不需要再做很多汇编代码的分析,因为前缀是(++i)可以返回对象的应用,而后缀是(i++)必须返回对象的值,所以导致在大对象的时候产生了较大的复制开销,引起效率降低,因此使用自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式递增或递减。


答案:


在内建数据类型的情况下,效率没有区别。


在自定义数据类型的情况下,++i的效率较高。


6、在C#中或

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇新北邦java笔试题 下一篇网友-2012年在武汉面试的大大小小..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: