1、下面的程序可以從0....n-1中隨機(jī)等概率的輸出m個(gè)不重復(fù)的的數(shù)。這里我們假設(shè)n遠(yuǎ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、【多選題】關(guān)于淺復(fù)制和深復(fù)制的說(shuō)法,下列說(shuō)法正確的是()
A.淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?,而不?fù)制引用對(duì)象本身
B.深層復(fù)制:復(fù)制引用對(duì)象本身
C.如果是淺復(fù)制,修改一個(gè)對(duì)象可能會(huì)影響另外一個(gè)對(duì)象
D.如果是深拷貝,修改一個(gè)對(duì)象不會(huì)影響到另外一個(gè)對(duì)象
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、【多選題】?jī)蓚€(gè)線程并發(fā)執(zhí)行以下代碼,假設(shè)a是全局變量,那么以下輸出()哪個(gè)是可能的
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ù)組第一個(gè)元素2),再將指針p自增1 (*p)++ 先去指針p指向的值(數(shù)組第一個(gè)元素2),再將該值自增1(數(shù)組第一個(gè)元素變?yōu)?) *++p 先將指針p自增1(此時(shí)指向數(shù)組第二個(gè)元素), 操作再取出該值 ++*p 先取指針p指向的值(數(shù)組第一個(gè)元素2),再將該值自增1(數(shù)組第一個(gè)元素變?yōu)?)
3、答案:ABCD
4、答案:B
這是考察static靜態(tài)局部變量的用法。 靜態(tài)局部變量的特點(diǎn): 1.該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存; 2.靜態(tài)局部變量在程序執(zhí)行到該對(duì)象的聲明處時(shí)被首次初始化,即以后的函數(shù)調(diào)用 不再進(jìn)行初始化; 3.靜態(tài)局部變量一般在聲明處初始化,如果沒(méi)有顯式初始化,會(huì)被程序自動(dòng)初始化為0。fun(1)時(shí) icount初始化為1,之后不再初始化,執(zhí)行第一條語(yǔ)句 icount=2; 打印出來(lái)是3; fun(2)時(shí) 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++異常處理模型有責(zé)任處理那些因?yàn)槌霈F(xiàn)異常而失效的對(duì)象,處理方式是調(diào)用這些失效對(duì)象的析構(gòu)函數(shù),釋放掉它們占用的資源。如果析構(gòu)函數(shù)再拋出異常,則會(huì)陷入無(wú)盡遞歸嵌套之中,因此這是不被允許的。
7、答案:ABCD
假設(shè)線程x和y同時(shí)執(zhí)行,x和y可隨時(shí)被搶占,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操作但沒(méi)有寫(xiě)回到內(nèi)存 這里關(guān)鍵有兩點(diǎn): (1)兩個(gè)線程可隨時(shí)被搶占 (2)++a和printf不是原子指令,可隨時(shí)被打斷;特別注意函數(shù)printf,a作為參數(shù)壓棧后,a再變化則不會(huì)影響輸出(printf實(shí)際打印的是壓棧的參數(shù),是值拷貝的棧變量)