1、下面的程序可以從0....n-1中隨機等概率的輸出m個不重復的的數(shù)。這里我們假設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]);}
程序的輸出結(jié)果是()
A.2
B.8
C.4
D.6
3、【多選題】關于淺復制和深復制的說法,下列說法正確的是()
A.淺層復制:只復制指向?qū)ο蟮闹羔槪粡椭埔脤ο蟊旧?/p>
B.深層復制:復制引用對象本身
C.如果是淺復制,修改一個對象可能會影響另外一個對象
D.如果是深拷貝,修改一個對象不會影響到另外一個對象
4、以下代碼最后一次打印結(jié)果是()
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、下列程序執(zhí)行后的輸出結(jié)果是()
void main()
{
char x=0xFFFF;
printf("%d\n",x--);
}
A.-32767
B.FFFE
C.-1
D.-32768
6、C++中構(gòu)造函數(shù)和析構(gòu)函數(shù)可以拋出異常嗎?
A.都不行
B.都可以
C.只有構(gòu)造函數(shù)可以
D.只有析構(gòu)函數(shù)可以
7、【多選題】兩個線程并發(fā)執(zhí)行以下代碼,假設a是全局變量,那么以下輸出()哪個是可能的
int a=1;
void foo(){
++a;
printf("%d",a);
}
A.3 2
B.2 3
C.3 3
D.2 2
答案區(qū):
1、答案:B
2、答案:D
解析:*p++ 先取指針p指向的值(數(shù)組第一個元素2),再將指針p自增1 (*p)++ 先去指針p指向的值(數(shù)組第一個元素2),再將該值自增1(數(shù)組第一個元素變?yōu)?) *++p 先將指針p自增1(此時指向數(shù)組第二個元素), 操作再取出該值 ++*p 先取指針p指向的值(數(shù)組第一個元素2),再將該值自增1(數(shù)組第一個元素變?yōu)?)
3、答案:ABCD
4、答案:B
這是考察static靜態(tài)局部變量的用法。 靜態(tài)局部變量的特點: 1.該變量在全局數(shù)據(jù)區(qū)分配內(nèi)存; 2.靜態(tài)局部變量在程序執(zhí)行到該對象的聲明處時被首次初始化,即以后的函數(shù)調(diào)用 不再進行初始化; 3.靜態(tài)局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0。fun(1)時 icount初始化為1,之后不再初始化,執(zhí)行第一條語句 icount=2; 打印出來是3; fun(2)時 icount=2+2=4,打印的結(jié)果是4+2=6.
5、答案:C
6、答案:C
析構(gòu)函數(shù)不能拋出異常,處理析構(gòu)函數(shù)異常的正確方式是將異常封裝在析構(gòu)函數(shù)內(nèi)部,而不是拋出異常,如下代碼所示。 ~ClassName(){ try{ do_something(); } catch{ //... } } 原因如下:C++異常處理模型有責任處理那些因為出現(xiàn)異常而失效的對象,處理方式是調(diào)用這些失效對象的析構(gòu)函數(shù),釋放掉它們占用的資源。如果析構(gòu)函數(shù)再拋出異常,則會陷入無盡遞歸嵌套之中,因此這是不被允許的。
7、答案:ABCD
假設線程x和y同時執(zhí)行,x和y可隨時被搶占,a的初始值為1 A:3, 2 y先執(zhí)行++a,a為2; y再執(zhí)行printf,a入棧,在打印到終端之前切換到x x執(zhí)行++a,a為3; x執(zhí)行printf,輸出3;再切換到y(tǒng) y執(zhí)行打印,輸出2 B:2 3 x先執(zhí)行++a,a為2; x再執(zhí)行printf,輸出2;切換到y(tǒng) y執(zhí)行++a,a為3; y執(zhí)行printf,輸出3; C:3 3 x先執(zhí)行++a,a為2;切換到y(tǒng) y執(zhí)行++a,a為3; y執(zhí)行printf,輸出3;切換到x x執(zhí)行printf,輸出3 D:2 2 類似C, 執(zhí)行++a操作但沒有寫回到內(nèi)存 這里關鍵有兩點: (1)兩個線程可隨時被搶占 (2)++a和printf不是原子指令,可隨時被打斷;特別注意函數(shù)printf,a作為參數(shù)壓棧后,a再變化則不會影響輸出(printf實際打印的是壓棧的參數(shù),是值拷貝的棧變量)