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實際打印的是壓棧的參數,是值拷貝的棧變量)