面试挖坑题系列—第一季

1、下面的程序可以从0....n-1中随机等概率的输出m个不重复的的数。这里我们假设n远大于m。

ningth(int n,int m)
{
 srand((unsigned int)time(0));
 for(int i=;i<n;i++){
  if(?){
   count<<i<<endl;
   (?);
  }
 }
}

A.rand()%(n-i)<=m;m--;

B.rand()%(n-i)<m;m--;

C.rand()%(n-i)>=m;m++;

D.rand()%(n-i)>m;m++;

2、有以下程序

#include <stdio.h>
mian()
{
 int a[]={2,4,6,8},*p=a,i;
 for(i=0;i<4;i++)
 a[i]=*p++;
 printf("%d\n",a[2]);
}

程序的输出结果是()

A.2 B.8 C.4 D.6

3、关于浅复制和深复制的说法,下列说法正确的是()(多选题)

A.浅层复制:只复制指向对象的指针,而不复制引用对象本身

B.深层复制:复制引用对象本身

C.如果是浅复制,修改一个对象可能会影响另外一个对象

D.如果是深拷贝,修改一个对象不会影响到另外一个对象

4、以下代码最后一次打印结果是()

void fun(int iinputnum)
{
 static int icount=1;
 icount=icount+iinputnum;
 printf("\n icount=%d"icount+iinputnum);
}
for(i=1;i<3;i++)
 fun(i);

A.icount=3

B.icount=6

C.icount=4

D.icount=20

5、下列程序执行后的输出结果是()

void main()
{
 char x=0xFFFF;
 printf("%d\n",x--);
}

A.-32767

B.FFFE

C.-1

D.-32768

6、C++中构造函数和析构函数可以抛出异常吗?

A.都不行 B.都可以 C.只有构造函数可以 D.只有析构函数可以

7、两个线程并发执行以下代码,假设a是全局变量,那么以下输出()哪个是可能的(多选题哦)

int a=1;
void foo(){
 ++a;
 printf("%d",a);
}

A.3 2 B.2 3 C.3 3 D.2 2

答案区:

(1)答案:B

(2)答案:D

解析:*p++ 先取指针p指向的值(数组第一个元素2),再将指针p自增1
(*p)++ 先去指针p指向的值(数组第一个元素2),再将该值自增1(数组第一个元素变为3)
*++p 先将指针p自增1(此时指向数组第二个元素), 操作再取出该值
++*p 先取指针p指向的值(数组第一个元素2),再将该值自增1(数组第一个元素变为3)

(3)答案:ABCD

(4)答案:B

这是考察static静态局部变量的用法。
静态局部变量的特点:
1.该变量在全局数据区分配内存;
2.静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用
不再进行初始化;
3.静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。fun(1)时
icount初始化为1,之后不再初始化,执行第一条语句
icount=2;
打印出来是3;
fun(2)时
icount=2+2=4,打印的结果是4+2=6.

(5)答案:C

(6)答案:C

析构函数不能抛出异常,处理析构函数异常的正确方式是将异常封装在析构函数内部,而不是抛出异常,如下代码所示。
~ClassName(){
try{
do_something();
}
catch{
//...
}
}
原因如下:C++异常处理模型有责任处理那些因为出现异常而失效的对象,处理方式是调用这些失效对象的析构函数,释放掉它们占用的资源。如果析构函数再抛出异常,则会陷入无尽递归嵌套之中,因此这是不被允许的。

(7)答案:ABCD

假设线程x和y同时执行,x和y可随时被抢占,a的初始值为1
A:3, 2
y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2
B:2 3
x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;
C:3 3
x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3
D:2 2
类似C,
执行++a操作但没有写回到内存
这里关键有两点:
(1)两个线程可随时被抢占
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)