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