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实际打印的是压栈的参数,是值拷贝的栈变量)