當(dāng)前位置:
首頁 >
部分真题整理3
發(fā)布時(shí)間:2025/10/17
27
豆豆
1、 java語言中,按照一定格式生成程序的文檔的工具是?
javac
javah
javadoc
jar
2、下列關(guān)于java抽象類的說法哪個(gè)正確?(D)
某個(gè)抽象類的父類是抽象類,則這個(gè)子類必須重載父類的所有抽象方法
接口和抽象類是同一回事
可以用抽象類直接去實(shí)例化創(chuàng)建對(duì)象
一個(gè)類只能繼承一個(gè)抽象類
解析:
如果一個(gè)類中有抽象方法,那么這個(gè)類必須聲明為 抽象類
若父類包含有抽象方法(父類肯定是 抽象類 了), 子類必須去實(shí)現(xiàn)它
若父類是 抽象類 ,但某個(gè)方法是非抽象的, 那么子類可以直接繼承這個(gè)方法(不用實(shí)現(xiàn))
抽象類一般不能被實(shí)例化;
抽象類通常不是由程序員定義的,而是由項(xiàng)目經(jīng)理或模塊設(shè)計(jì)人 設(shè)計(jì)抽象類的原因通常是為了規(guī)范方法名 抽象類必須要繼承,不然沒法用,作為模塊設(shè)計(jì)者,可以把讓底層程序員直接用得方法直接調(diào)用,而一些需要讓程序員覆蓋后自己做得方法則定義稱抽象方法
Java不支持多繼承,但是通過一些巧妙的設(shè)計(jì)來達(dá)到和多繼承同樣的效果
通過接口、內(nèi)隱類,繼承、實(shí)現(xiàn),互相配合,達(dá)到多繼承的效果
1、Java中一個(gè)類不能繼承多個(gè)具體class。
2、一個(gè)類只可繼承自一個(gè)具體 class,但可實(shí)現(xiàn)多個(gè)接口。
interface不涉及到實(shí)現(xiàn)細(xì)節(jié),不與任何存儲(chǔ)空間有關(guān)連。
可以實(shí)現(xiàn)合并多個(gè) interface ,達(dá)到可向上轉(zhuǎn)型為多種基類的目的。
新類可繼承自一個(gè)具象class,其余繼承都得是interfaces。
3、outer class不可繼承自多個(gè)具體 class,可在其內(nèi)部設(shè)多個(gè)inner class,每個(gè)inner class都能各自繼承某一實(shí)現(xiàn)類。
inner class不受限于outer class 是否已經(jīng)繼承自某一實(shí)現(xiàn)類。
4、inner class可以說是多重繼承問題的完整解決方案。
inner class 可 “繼承自多個(gè)具象或抽象類”。
一個(gè)類不能繼承自多個(gè)一般類。但我們可以讓其內(nèi)部的多個(gè)inner class各自繼承某一實(shí)現(xiàn)類達(dá)到類似的目的。
3、兩個(gè)等價(jià)線程并發(fā)的執(zhí)行下列程序,a為全局變量,初始為0,假設(shè)printf、++、--操作都是原子性的,則輸出肯定不是哪個(gè)?(A)
void foo() { if(a <= 0) { a++; } else { a--; } printf("%d", a); }01
10
12
22
解析:
每個(gè)線程進(jìn)foo函數(shù)不止一次,那么我們暫且假設(shè)兩個(gè)線程分別進(jìn)入foo函數(shù)X次,
假設(shè)給線程編號(hào),線程1有m次被堵在a++,線程2有n次被堵在a++處,
那么線程1必然會(huì)執(zhí)行(X-m)次a- -,線程2必然會(huì)執(zhí)行(X-n)次a- -,
那么最終a的值為(m+n)-((X-m)+(X-n))=2(m+n)-2X,
那么a必然是偶數(shù)
對(duì)于B選項(xiàng):P1執(zhí)行程序,輸入1,P2執(zhí)行程序,輸出0;
對(duì)于C選項(xiàng):初始為0,P1執(zhí)行完判斷語句,決定要執(zhí)行a++,中斷,P2進(jìn)行判斷,此時(shí)a仍然等于0,執(zhí)行判斷語句,并執(zhí)行輸入,得到1,P1然后繼續(xù)執(zhí)行,此時(shí)它該執(zhí)行a++,這時(shí)a=1,執(zhí)行并輸出,結(jié)果為2;
對(duì)于D答案:初始為0,P1執(zhí)行完判斷語句,決定要執(zhí)行a++,中斷,P2進(jìn)行判斷,此時(shí)a仍然等于0,執(zhí)行a++,得到a=1,中斷,P1繼續(xù)執(zhí)行a++,a=2,P1輸出,得到2,P1結(jié)束,P2繼續(xù)執(zhí)行輸出語句,得到2;
4、
void swap_int(int *a,int *b){ *a=*a+*b; *b=*a-*b; *a=*a-*b; }以下說法正確的是:(B)
結(jié)果不正確,因?yàn)闀?huì)溢出,用位與的方式就沒問題
結(jié)果正確,即使會(huì)溢出
結(jié)果正確,不會(huì)溢出
其他選項(xiàng)都不對(duì)
解析:
設(shè)整形變量*a、*b的位表示為
*a = n31n30 ??? n0
*b = m31m30 ??? m0
只有當(dāng)*a > 0 && *b > 0 或 *a < 0 && *b < 0時(shí)才會(huì)發(fā)生溢出。兩者類似,只證明均大于0時(shí)的情況。必須擴(kuò)展額外一位才能夠容納正確的結(jié)果,'|'左邊為擴(kuò)展位。
*a = 0|0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20 = N
*b = 0|0m30 ??? m0 = m30*230 + m29*229 + ??? + m0*20 = M
若和溢出,則33位表示必為
*a + *b = 0|1b30 ??? b0 = -231 + b30*230 + b29*229 + ??? + b0*20 = 2 31 + B ①
計(jì)算機(jī)將得到的33位結(jié)果truncate回原來的32位,即丟棄第33位(0)變?yōu)?#xff1a;
*a + *b = 1b30 ??? b0 = -231 + b30*230 + b29*229 + ??? + b0*20 = -2 31 + B ②
正確的真實(shí)值是①,溢出結(jié)果為②,可見溢出結(jié)果=真實(shí)值-2 32
則*b = *a - *b = ② - *b = ① - 232 - *b = *a + *b - 232 - *b = -232 + *a
最后一步,來看 -232 + *a == *a 成立否?
0 < *a < 231, 則 -232 < -232 + *a < -231,和仍需要擴(kuò)展1位方能表示:
*a = 0|0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20 = N
-232 = 1|0000 ??? 00
和的位表示為
-232 + *a = 1|0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20
同樣,計(jì)算機(jī)把33位結(jié)果truncate回32位(丟棄第33位)得到:
-232 + *a = 0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20 = *a
可見-232 + *a == *a 是成立的。因此盡管溢出了,但仍能正確交換。
可能經(jīng)驗(yàn)上的某種直覺告訴我們:加減法可能會(huì)溢出。其實(shí)不然,第一步的加運(yùn)算可能會(huì)造成溢出,但它所造成的溢出會(huì)在后邊的減運(yùn)算中被溢出回來。
5、 下面有關(guān)java的一些細(xì)節(jié)問題,描述錯(cuò)誤的是?(B)
構(gòu)造方法不需要同步化
一個(gè)子類不可以覆蓋掉父類的同步方法
定義在接口中的方法默認(rèn)是public的
容器保存的是對(duì)象的引用
6、 2014! 的末尾有 1 個(gè)0? 501
解析:
末尾為0,主要看乘積項(xiàng)中2和5的個(gè)數(shù),由于2的個(gè)數(shù)明顯比5多,則只需看5的個(gè)數(shù)即可
2014/5 = 402....4
2014/25 = 80....14
2014/125 = 16....14
2014/625 = 3....19
故2014!末尾0的個(gè)數(shù)為402+80+16+3 = 501
7、 關(guān)于排序算法的以下說法,錯(cuò)誤的是___(D)___。
快速排序的平均時(shí)間復(fù)雜度為O(nlogn),最壞時(shí)間復(fù)雜度為O(n2)
堆排序的平均時(shí)間復(fù)雜度為O(nlogn),最壞時(shí)間復(fù)雜度為O(nlogn)
冒泡排序的平均時(shí)間復(fù)雜度為O(n2),最壞時(shí)間復(fù)雜度為O(n2)
歸并排序的平均時(shí)間復(fù)雜度為O(nlogn),最壞時(shí)間復(fù)雜度為O(n2)
解析:
歸并排序是穩(wěn)定的排序方法。最壞和最好沒區(qū)別!O(nlogn)
8、下列代碼的輸出為:(B)
#include<iostream> #include<vector> using namespace std;int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for (itor = array.begin(); itor != array.end(); itor++) { if (*itor == 300) { itor = array.erase(itor); } } for (itor = array.begin(); itor != array.end(); itor++) { cout << *itor << " "; } return 0; } 100 300 300 500
100 300 500
100 500
程序錯(cuò)誤
解析:
vector 的erase函數(shù) 刪除指定位置的元素時(shí), 返回值是一個(gè)迭代器,指向刪除元素下一個(gè)元素。刪除第一個(gè)300后,itor指向其后的300,然后執(zhí)行itor++,指向了500.
9、下列程序的輸出結(jié)果:(C)
#include <iostream> using namespace std; class A { public: void print() { cout << "A:print()"; } }; class B: private A { public: void print() { cout << "B:print()"; } }; class C: public B { public: void print() { A: print(); } }; int main() { C b; b.print(); } A:print()
B:print()
編譯出錯(cuò)
解析:
B的繼承為私有繼承,對(duì)于C已經(jīng)不能再調(diào)用A的所有方法了
10、用戶雙擊鼠標(biāo)時(shí)產(chǎn)生的消息序列,下面正確的是(D)
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONUP,WM_LBUTTONDBLCLK
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONDBLCLK
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP
解析:
雙擊即點(diǎn)擊左鍵兩下,第一次觸發(fā)LBUTTONDOWN和LBUTTONUP,第二次點(diǎn)擊時(shí)觸發(fā)雙擊事件LBUTTONDBLCLK(doubleclick),放掉再觸發(fā)LBUTTONUP
11、下面有關(guān)繼承、多態(tài)、組合的描述,說法錯(cuò)誤的是?(D)
封裝,把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏
繼承可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展
隱藏是指派生類中的函數(shù)把基類中相同名字的函數(shù)屏蔽掉了
覆蓋是指不同的函數(shù)使用相同的函數(shù)名,但是函數(shù)的參數(shù)個(gè)數(shù)或類型不同
解析:
重載:
只有在 同一類定義中的同名成員函數(shù)才存在重載關(guān)系 ,主要特點(diǎn)是 函數(shù)的參數(shù)類型和數(shù)目有所不同 ,但 不能出現(xiàn)函數(shù)參數(shù)的個(gè)數(shù)和類型均相同 ,僅僅依靠返回值類型不同來區(qū)分的函數(shù),這和普通函數(shù)的重載是完全一致的。另外,重載和成員函數(shù)是否是虛函數(shù)無關(guān)
覆蓋:
在派生類中覆蓋基類中的同名函數(shù),要求兩個(gè)函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型、返回類型都相同,且基類函數(shù)必須是虛函數(shù)。
隱藏:
派生類中的函數(shù)屏蔽了基類中的同名函數(shù),
2個(gè)函數(shù)參數(shù)相同,但基類函數(shù)不是虛函數(shù)(和覆蓋的區(qū)別在于基類函數(shù)是否是虛函數(shù))。2個(gè)函數(shù)參數(shù)不同,無論基類函數(shù)是否是虛函數(shù),基類函數(shù)都會(huì)被屏蔽(和重載的區(qū)別在于兩個(gè)函數(shù)不在同一類中)。
12、
char *p1;int64 *p2; p1=(char *)0x800000; p2=(int64 *)0x800000; char *a=p1+2 int64_t *b=p2+2那么a= 1 0x800002 ,b= 2 0x800010
解析:
我們定義指針的時(shí)候給指針一個(gè)類型就是為了方便指針的加減操作。p1是char類型指針,每個(gè)char占一個(gè)字節(jié),所以p1+2就是在p1的基礎(chǔ)上加2個(gè)char的長度,就是兩個(gè)字節(jié)。p2是指向64位int型的指針,所以p2+2就是p2加上兩個(gè)64位int的長度,也就是加上128位,即16個(gè)字節(jié)。用16進(jìn)制表示是0x10
所以a=0x800000+0x2=0x800002
b=0x800000+0x10=0x800010
指針里面存的是地址,所以指針的加減也是為了求得變化后的地址,即假設(shè)指針的類型是T,那么新的地址應(yīng)該就是原地址+sizeof(T)個(gè)字節(jié)后得到的地址,也就是說它加的實(shí)質(zhì)還是相應(yīng)的字節(jié)數(shù),而這個(gè)字節(jié)數(shù)是多少得看指針的類型,本題中第一個(gè)是char類型,那么加2就是倆個(gè)字節(jié),第二個(gè)是64位的int,那么相應(yīng)的指針類型就是8字節(jié),因?yàn)橹羔樉褪菫榱藢さ刂返?#xff0c;與cpu的位數(shù)有關(guān),一個(gè)字節(jié)8位,因此它加2就是加2*sizeof(int64),轉(zhuǎn)16進(jìn)制為0x1
13、 請(qǐng)問以下說法,哪個(gè)是正確的:(C)
每個(gè)類都有一個(gè)無參數(shù)的構(gòu)造函數(shù)。
每個(gè)類都有一個(gè)拷貝構(gòu)造的函數(shù)。
每個(gè)類能有多個(gè)構(gòu)造函數(shù)。
每個(gè)類能有多個(gè)析構(gòu)函數(shù)。
解析:
A:用戶自定義了構(gòu)造函數(shù)編譯器不會(huì)合成無參構(gòu)造函數(shù)
B:?一個(gè)類可以有多個(gè)拷貝構(gòu)造函數(shù)
class A{}; class B: public A{ public: B(const B&); B(const A&); };class A{}; class B: public A{ public: B(const B&); B(const A&); };D:一個(gè)類只能有一個(gè)析構(gòu)函數(shù)
14、選擇填空:(D)
#include void test(void *data) { unsigned int value = (此處應(yīng)填入) printf("%u", value); } using namespace std; int main() { unsigned int value = 10; test(&value); return 0; }*data
(unsigned int)(*data)
(unsigned*)data
*((unsigned int *)data)
解析:
注意,參數(shù)類型是void, 所以先要進(jìn)行指針轉(zhuǎn)換:(unsigned int *)然后再取值。
15、 在C++語言中,下列說法正確的是:(D)
inline函數(shù)表示編譯器一定會(huì)將函數(shù)體直接插入到調(diào)用此函數(shù)的地方,這樣可以加快程序的運(yùn)行速度
局部變量和全局變量不能重名
靜態(tài)局部變量內(nèi)存是在運(yùn)行期分配的,存儲(chǔ)在堆棧區(qū)
C++不是類型安全的語言
解析:
首先,可以排除B和C。B選項(xiàng),因?yàn)榫植孔兞亢腿肿兞渴强梢灾孛?#xff0c;而且一般來說在某個(gè)函數(shù)體內(nèi),局部變量是會(huì)覆蓋全局變量的。C選項(xiàng),靜態(tài)局部變量存在靜態(tài)存儲(chǔ)區(qū),而局部變量存儲(chǔ)在堆棧區(qū),確切的說是棧區(qū)。再看A選項(xiàng),內(nèi)聯(lián)函數(shù)與其他普通函數(shù)的區(qū)別是,內(nèi)聯(lián)函數(shù)在生成可執(zhí)行文件時(shí),其代碼塊是直接嵌入到調(diào)用處的,以此減少函數(shù)調(diào)用的開銷提高程序性能,它與宏很類似。但是,C++ primer 上明明白白的寫過這么一句話:內(nèi)聯(lián)說明(inline specification)對(duì)于編譯器來說只是一個(gè)建議,編譯器可以選擇忽略這個(gè)建議。也就是說,是否以嵌入式方式存在,是由編譯器決定的,并不是一定。最后看D選項(xiàng),什么叫類型安全的語言?本人很淺陋的認(rèn)識(shí)是:就C++而言,我們可以把0作為false,非零作為true。一個(gè)函數(shù)就算是bool類型的,我們還是可以返回int類型,并且自動(dòng)把0轉(zhuǎn)化成false,非零轉(zhuǎn)化成true。相比之下java不能把int類型轉(zhuǎn)化成bool類型。所以java是一種類型安全的語言,而C++并不是。 答案選D
16、關(guān)于Spring MVC的核心控制器DispatcherServlet的作用,以下說法錯(cuò)誤的是(C)?
它負(fù)責(zé)接收HTTP請(qǐng)求
加載配置文件
實(shí)現(xiàn)業(yè)務(wù)操作
初始化上下應(yīng)用對(duì)象ApplicationContext
解析:
DispatcherServlet是的servlet,所以肯定負(fù)責(zé)手http
可以在web.xml中配置spring-mvc.xml,用于加載配置信息。
當(dāng)沒有上下文時(shí),該它會(huì)新創(chuàng)建一個(gè)上下文。
DispatcherServlet用于分發(fā)http到具體的業(yè)務(wù)方法,所以實(shí)現(xiàn)業(yè)務(wù)的其實(shí)是具體的bean的方法。
17、以下代碼的輸出結(jié)果是?(A)
#define a 10void foo(); main(){printf("%d..",a); foo(); printf("%d",a); } void foo(){ #undef a #define a 50 }10..10
10..50
Error
0
解析:
選A,define在預(yù)處理階段就把main中的a全部替換為10了.
另外,不管是在某個(gè)函數(shù)內(nèi),還是在函數(shù)外,define都是從定義開始知道文件結(jié)尾,所以如果把foo函數(shù)放到main上面的話,則結(jié)果會(huì)是50 ,50
18、 1000 個(gè)瓶子中有一瓶毒藥,一只老鼠吃到毒藥一周之內(nèi)會(huì)死,如果要在一周之內(nèi)檢測出有毒藥的一瓶,問至少需要幾只老鼠?(B)
8
10
32
999
解析:
1000個(gè)瓶子編號(hào)1-1000, 每個(gè)編號(hào)會(huì)有一個(gè)10位的二進(jìn)制數(shù)字。 10只老鼠,依次喝掉所有二進(jìn)制第一位是1的瓶子,第二位是1的瓶子。。。第十位是1的瓶子。 一周之后,死掉的老鼠說明毒藥瓶子編號(hào)在對(duì)應(yīng)二進(jìn)制位置是1,否則是0。可以組合出毒藥的編號(hào)。(每位相同的混一起)
1000分為2組,每組500樣物品,取一點(diǎn)放在一起,每組放一只白鼠。 犧牲一只小白鼠 ,保留下500分可能是毒藥的,繼續(xù)分 2 , 250 3 , 125 4 , 62或63 5 , 31或32 6 , 15或16 7 , 7或8 8 , 3或4 9 , 1或2 10 。所以至少為10次(不能保證一周內(nèi)。)
19、有如下模板定義:
template <class T> T fun(T x,T y){ return x*x+y*y; }在下列對(duì)fun的調(diào)用中,錯(cuò)誤的是(B)
fun(1, 2)
fun(1.0, 2)
fun(2.0, 1.0)
fun<float>(1, 2.0)
解析:
模板函數(shù)應(yīng)該定義為(加返回值類似聲明):
template <class T> T fun(T x,T y){ return x*x+y*y;}然后這里T要求類型一致
A,類型一致,為int型
B,類型不一致,錯(cuò)我
C,類型一致,為folat型
D,用<float>進(jìn)行聲明,后面的實(shí)參會(huì)強(qiáng)制類型轉(zhuǎn)換為float,所以也是類型一致的。
20、對(duì)于以下代碼(C)
char * p= new char[100]p 和 new出來的內(nèi)存都在棧上
p 和 new出來的內(nèi)存都在堆上
p在棧上 new出來的在堆上
p在堆上 new出來的在棧上
解析:
動(dòng)態(tài)分配就在堆區(qū),其他都不在堆區(qū)
21、有字符序列 {Q,H,C,Y,P,A,M,S,R,D,F,X} ,新序列{F,H,C,D,P,A,M,Q,R,S,Y,X},是下列(B)____排序算法一趟掃描的結(jié)果。
二路歸并排序
快速排序
步長為 4 的希爾排序
步長為 2 的希爾排序
冒泡排序
堆排序
解析:
拿Q作為分割點(diǎn),快速排序一輪
二路歸并:H Q C Y A P M S D R F X
快速排序:F,H,C,D,P,A,M,Q,R,S,Y,X
冒泡排序:第一趟有A在第一位
堆排序:第一趟Y排在最后
如果是二路歸并的話,那么第一趟結(jié)束后每四個(gè)都是有序的
如果是快速排序的話,第一個(gè)元素將會(huì)被放到一個(gè)最準(zhǔn)確的位置,且第一個(gè)元素前面的都比它小,后面的都比它大
如果是shell排序的話,那么每個(gè)小分組內(nèi)將會(huì)是有序的
如果是堆排序的話,那么把它構(gòu)成一顆二叉樹的時(shí)候,該堆要么就是大根堆,要么就是小根堆
如果是冒泡的話,那么肯定會(huì)有數(shù)據(jù)下沉的動(dòng)作
22、下面代碼的輸出結(jié)果是?(C)
void main(void) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }1,2
2,4
2,5
出錯(cuò)
解析:
*(a+1)其實(shí)很簡單就是指a[1],輸出為2.
問題關(guān)鍵就在于第二個(gè)點(diǎn),*(ptr-1)輸出為多少?
解釋如下,&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加了一個(gè)整個(gè)a數(shù)組,偏移了整個(gè)數(shù)組a的大小(也就是5個(gè)int的大小)。所以int *ptr=(int *)(&a+1);其實(shí)ptr實(shí)際是&(a[5]),也就是a+5.
原因?yàn)楹文?#xff1f;
&a是數(shù)組指針,其類型為int(*)[5];
而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同,a是長度為5的int數(shù)組指針,所以要加5*sizeof(int),所以ptr實(shí)際是a[5],但是ptr與(&a+1)類型是不一樣的,這點(diǎn)非常重要,所以ptr-1只會(huì)減去sizeof(int*),a,&a的地址是一樣的,但意思就不一樣了,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5]。
23、 下列關(guān)于AOE網(wǎng)的敘述中,不正確的是(B)
關(guān)鍵活動(dòng)不按期完成就會(huì)影響整個(gè)工程的完成時(shí)間
任何一個(gè)關(guān)鍵活動(dòng)提前完成,那么整個(gè)工程將會(huì)提前完成
所有的關(guān)鍵活動(dòng)提前完成,那么整個(gè)工程將會(huì)提前完成
某些關(guān)鍵活動(dòng)若提前完成,那么整個(gè)工程將會(huì)提前完成
解析:
關(guān)鍵活動(dòng)組成了關(guān)鍵路徑,關(guān)鍵路徑是圖中的最長路徑,關(guān)鍵路徑長度代表整個(gè)工期的最短完成時(shí)間,關(guān)鍵活動(dòng)延期完成,必將導(dǎo)致關(guān)鍵路徑長度增加,即整個(gè)工期的最短完成時(shí)間增加,因此A正確。關(guān)鍵路徑并不唯一,當(dāng)有多條關(guān)鍵路徑存在時(shí),其中一條關(guān)鍵路徑上的關(guān)鍵活動(dòng)時(shí)間縮短,只能導(dǎo)致本條關(guān)鍵路徑變成非關(guān)鍵路徑,而無法縮短整個(gè)工期,因?yàn)槠渌P(guān)鍵路徑?jīng)]有變化,因此B項(xiàng)不正確。對(duì)于A,B兩項(xiàng)要搞懂的是,任何一條關(guān)鍵路徑上的關(guān)鍵活動(dòng)變長了,都會(huì)使這條關(guān)鍵路徑變成更長的關(guān)鍵路徑,并且導(dǎo)致其他關(guān)鍵路徑變成非關(guān)鍵路徑(如果關(guān)鍵路徑不唯一),因此整個(gè)工期延長。而某些關(guān)鍵活動(dòng)縮短則不一定縮短整個(gè)工期。理解了A,B兩項(xiàng),C,D就很容易理解了
24、int main(){fork()||fork();}共創(chuàng)建幾個(gè)進(jìn)程:_C____
1
2
3
4
5
6
解析:
fork()給子進(jìn)程返回一個(gè)零值,而給父進(jìn)程返回一個(gè)非零值;
在main這個(gè)主進(jìn)程中,首先執(zhí)行 fork() || fork(), 左邊的fork()返回一個(gè)非零值,根據(jù)||的短路原則,前面的表達(dá)式為真時(shí),后面的表達(dá)式不執(zhí)行,故包含main的這個(gè)主進(jìn)程創(chuàng)建了一個(gè)子進(jìn)程,
由于子進(jìn)程會(huì)復(fù)制父進(jìn)程,而且子進(jìn)程會(huì)根據(jù)其返回值繼續(xù)執(zhí)行,就是說,在子進(jìn)程中, fork() ||fork()這條語句左邊表達(dá)式的返回值是0, 所以||右邊的表達(dá)式要執(zhí)行,這時(shí)在子進(jìn)程中又創(chuàng)建了一個(gè)進(jìn)程,
即main進(jìn)程->子進(jìn)程->子進(jìn)程,一共創(chuàng)建了3個(gè)進(jìn)程。
25、下列說法錯(cuò)誤的有(ACD )
在類方法中可用this來調(diào)用本類的類方法
在類方法中調(diào)用本類的類方法時(shí)可直接調(diào)用
在類方法中只能調(diào)用本類中的類方法
在類方法中絕對(duì)不能調(diào)用實(shí)例方法
解析:
A:類方法是指類中被static修飾的方法,無this指針。
C:類方法是可以調(diào)用其他類的static方法的。
D:可以在類方法中生成實(shí)例對(duì)象再調(diào)用實(shí)例方法。(這個(gè)我也打錯(cuò)了,想想應(yīng)該是這個(gè)意思)
首先:
成員方法又稱為實(shí)例方法
靜態(tài)方法又稱為類方法
其次:
a,靜態(tài)方法中沒有this指針
c,可以通過類名作用域的方式調(diào)用Class::fun();
d,太絕對(duì)化了,在類中申請(qǐng)一個(gè)類對(duì)象或者參數(shù)傳遞一個(gè)對(duì)象或者指針都可以調(diào)用;
:this代表的是本類的對(duì)象,即實(shí)例。類方法之所以不能用this,是因?yàn)轭惙椒ㄊ请S著類的加載而加載,在對(duì)象創(chuàng)建之前就已經(jīng)存在。
A:類方法是類中被static修飾的方法,沒有this指針。C++的this指針:一個(gè)對(duì)象的this指針并不是對(duì)象本身的一部分,不會(huì)影響sizeof(對(duì)象)的結(jié)果。this作用域是在類內(nèi)部,當(dāng)在類的非靜態(tài)成員函數(shù)中訪問類的非靜態(tài)成員的時(shí)候,編譯器會(huì)自動(dòng)將對(duì)象本身的地址作為一個(gè)隱含參數(shù)傳遞給函數(shù)。
C:類方法是可以調(diào)用其他類的static方法的。
D:可以在類方法中生成實(shí)例對(duì)象再調(diào)用實(shí)例方法。
26、12個(gè)元素的排序數(shù)組進(jìn)行二分查找,每個(gè)元素被查找的概率是相等的,平均比較次數(shù)為 13 。37/12
解析:
平均查找長度公式為:ASL={[(n+1)/n]*log2^(n+1)}-1,也可以直接算出來,1*1+2*2+3*4+4*5=37,故其次數(shù)為37/12。
javac
javah
javadoc
jar
2、下列關(guān)于java抽象類的說法哪個(gè)正確?(D)
某個(gè)抽象類的父類是抽象類,則這個(gè)子類必須重載父類的所有抽象方法
接口和抽象類是同一回事
可以用抽象類直接去實(shí)例化創(chuàng)建對(duì)象
一個(gè)類只能繼承一個(gè)抽象類
解析:
如果一個(gè)類中有抽象方法,那么這個(gè)類必須聲明為 抽象類
若父類包含有抽象方法(父類肯定是 抽象類 了), 子類必須去實(shí)現(xiàn)它
若父類是 抽象類 ,但某個(gè)方法是非抽象的, 那么子類可以直接繼承這個(gè)方法(不用實(shí)現(xiàn))
抽象類一般不能被實(shí)例化;
抽象類通常不是由程序員定義的,而是由項(xiàng)目經(jīng)理或模塊設(shè)計(jì)人 設(shè)計(jì)抽象類的原因通常是為了規(guī)范方法名 抽象類必須要繼承,不然沒法用,作為模塊設(shè)計(jì)者,可以把讓底層程序員直接用得方法直接調(diào)用,而一些需要讓程序員覆蓋后自己做得方法則定義稱抽象方法
Java不支持多繼承,但是通過一些巧妙的設(shè)計(jì)來達(dá)到和多繼承同樣的效果
通過接口、內(nèi)隱類,繼承、實(shí)現(xiàn),互相配合,達(dá)到多繼承的效果
1、Java中一個(gè)類不能繼承多個(gè)具體class。
2、一個(gè)類只可繼承自一個(gè)具體 class,但可實(shí)現(xiàn)多個(gè)接口。
interface不涉及到實(shí)現(xiàn)細(xì)節(jié),不與任何存儲(chǔ)空間有關(guān)連。
可以實(shí)現(xiàn)合并多個(gè) interface ,達(dá)到可向上轉(zhuǎn)型為多種基類的目的。
新類可繼承自一個(gè)具象class,其余繼承都得是interfaces。
3、outer class不可繼承自多個(gè)具體 class,可在其內(nèi)部設(shè)多個(gè)inner class,每個(gè)inner class都能各自繼承某一實(shí)現(xiàn)類。
inner class不受限于outer class 是否已經(jīng)繼承自某一實(shí)現(xiàn)類。
4、inner class可以說是多重繼承問題的完整解決方案。
inner class 可 “繼承自多個(gè)具象或抽象類”。
一個(gè)類不能繼承自多個(gè)一般類。但我們可以讓其內(nèi)部的多個(gè)inner class各自繼承某一實(shí)現(xiàn)類達(dá)到類似的目的。
3、兩個(gè)等價(jià)線程并發(fā)的執(zhí)行下列程序,a為全局變量,初始為0,假設(shè)printf、++、--操作都是原子性的,則輸出肯定不是哪個(gè)?(A)
void foo() { if(a <= 0) { a++; } else { a--; } printf("%d", a); }01
10
12
22
解析:
每個(gè)線程進(jìn)foo函數(shù)不止一次,那么我們暫且假設(shè)兩個(gè)線程分別進(jìn)入foo函數(shù)X次,
假設(shè)給線程編號(hào),線程1有m次被堵在a++,線程2有n次被堵在a++處,
那么線程1必然會(huì)執(zhí)行(X-m)次a- -,線程2必然會(huì)執(zhí)行(X-n)次a- -,
那么最終a的值為(m+n)-((X-m)+(X-n))=2(m+n)-2X,
那么a必然是偶數(shù)
對(duì)于B選項(xiàng):P1執(zhí)行程序,輸入1,P2執(zhí)行程序,輸出0;
對(duì)于C選項(xiàng):初始為0,P1執(zhí)行完判斷語句,決定要執(zhí)行a++,中斷,P2進(jìn)行判斷,此時(shí)a仍然等于0,執(zhí)行判斷語句,并執(zhí)行輸入,得到1,P1然后繼續(xù)執(zhí)行,此時(shí)它該執(zhí)行a++,這時(shí)a=1,執(zhí)行并輸出,結(jié)果為2;
對(duì)于D答案:初始為0,P1執(zhí)行完判斷語句,決定要執(zhí)行a++,中斷,P2進(jìn)行判斷,此時(shí)a仍然等于0,執(zhí)行a++,得到a=1,中斷,P1繼續(xù)執(zhí)行a++,a=2,P1輸出,得到2,P1結(jié)束,P2繼續(xù)執(zhí)行輸出語句,得到2;
4、
void swap_int(int *a,int *b){ *a=*a+*b; *b=*a-*b; *a=*a-*b; }以下說法正確的是:(B)
結(jié)果不正確,因?yàn)闀?huì)溢出,用位與的方式就沒問題
結(jié)果正確,即使會(huì)溢出
結(jié)果正確,不會(huì)溢出
其他選項(xiàng)都不對(duì)
解析:
設(shè)整形變量*a、*b的位表示為
*a = n31n30 ??? n0
*b = m31m30 ??? m0
只有當(dāng)*a > 0 && *b > 0 或 *a < 0 && *b < 0時(shí)才會(huì)發(fā)生溢出。兩者類似,只證明均大于0時(shí)的情況。必須擴(kuò)展額外一位才能夠容納正確的結(jié)果,'|'左邊為擴(kuò)展位。
*a = 0|0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20 = N
*b = 0|0m30 ??? m0 = m30*230 + m29*229 + ??? + m0*20 = M
若和溢出,則33位表示必為
*a + *b = 0|1b30 ??? b0 = -231 + b30*230 + b29*229 + ??? + b0*20 = 2 31 + B ①
計(jì)算機(jī)將得到的33位結(jié)果truncate回原來的32位,即丟棄第33位(0)變?yōu)?#xff1a;
*a + *b = 1b30 ??? b0 = -231 + b30*230 + b29*229 + ??? + b0*20 = -2 31 + B ②
正確的真實(shí)值是①,溢出結(jié)果為②,可見溢出結(jié)果=真實(shí)值-2 32
則*b = *a - *b = ② - *b = ① - 232 - *b = *a + *b - 232 - *b = -232 + *a
最后一步,來看 -232 + *a == *a 成立否?
0 < *a < 231, 則 -232 < -232 + *a < -231,和仍需要擴(kuò)展1位方能表示:
*a = 0|0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20 = N
-232 = 1|0000 ??? 00
和的位表示為
-232 + *a = 1|0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20
同樣,計(jì)算機(jī)把33位結(jié)果truncate回32位(丟棄第33位)得到:
-232 + *a = 0n30 ??? n0 = n30*230 + n29*229 + ??? + n0*20 = *a
可見-232 + *a == *a 是成立的。因此盡管溢出了,但仍能正確交換。
可能經(jīng)驗(yàn)上的某種直覺告訴我們:加減法可能會(huì)溢出。其實(shí)不然,第一步的加運(yùn)算可能會(huì)造成溢出,但它所造成的溢出會(huì)在后邊的減運(yùn)算中被溢出回來。
5、 下面有關(guān)java的一些細(xì)節(jié)問題,描述錯(cuò)誤的是?(B)
構(gòu)造方法不需要同步化
一個(gè)子類不可以覆蓋掉父類的同步方法
定義在接口中的方法默認(rèn)是public的
容器保存的是對(duì)象的引用
6、 2014! 的末尾有 1 個(gè)0? 501
解析:
末尾為0,主要看乘積項(xiàng)中2和5的個(gè)數(shù),由于2的個(gè)數(shù)明顯比5多,則只需看5的個(gè)數(shù)即可
2014/5 = 402....4
2014/25 = 80....14
2014/125 = 16....14
2014/625 = 3....19
故2014!末尾0的個(gè)數(shù)為402+80+16+3 = 501
7、 關(guān)于排序算法的以下說法,錯(cuò)誤的是___(D)___。
快速排序的平均時(shí)間復(fù)雜度為O(nlogn),最壞時(shí)間復(fù)雜度為O(n2)
堆排序的平均時(shí)間復(fù)雜度為O(nlogn),最壞時(shí)間復(fù)雜度為O(nlogn)
冒泡排序的平均時(shí)間復(fù)雜度為O(n2),最壞時(shí)間復(fù)雜度為O(n2)
歸并排序的平均時(shí)間復(fù)雜度為O(nlogn),最壞時(shí)間復(fù)雜度為O(n2)
解析:
歸并排序是穩(wěn)定的排序方法。最壞和最好沒區(qū)別!O(nlogn)
8、下列代碼的輸出為:(B)
#include<iostream> #include<vector> using namespace std;int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for (itor = array.begin(); itor != array.end(); itor++) { if (*itor == 300) { itor = array.erase(itor); } } for (itor = array.begin(); itor != array.end(); itor++) { cout << *itor << " "; } return 0; } 100 300 300 500
100 300 500
100 500
程序錯(cuò)誤
解析:
vector 的erase函數(shù) 刪除指定位置的元素時(shí), 返回值是一個(gè)迭代器,指向刪除元素下一個(gè)元素。刪除第一個(gè)300后,itor指向其后的300,然后執(zhí)行itor++,指向了500.
9、下列程序的輸出結(jié)果:(C)
#include <iostream> using namespace std; class A { public: void print() { cout << "A:print()"; } }; class B: private A { public: void print() { cout << "B:print()"; } }; class C: public B { public: void print() { A: print(); } }; int main() { C b; b.print(); } A:print()
B:print()
編譯出錯(cuò)
解析:
B的繼承為私有繼承,對(duì)于C已經(jīng)不能再調(diào)用A的所有方法了
10、用戶雙擊鼠標(biāo)時(shí)產(chǎn)生的消息序列,下面正確的是(D)
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONUP,WM_LBUTTONDBLCLK
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONDBLCLK
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP
解析:
雙擊即點(diǎn)擊左鍵兩下,第一次觸發(fā)LBUTTONDOWN和LBUTTONUP,第二次點(diǎn)擊時(shí)觸發(fā)雙擊事件LBUTTONDBLCLK(doubleclick),放掉再觸發(fā)LBUTTONUP
11、下面有關(guān)繼承、多態(tài)、組合的描述,說法錯(cuò)誤的是?(D)
封裝,把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏
繼承可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展
隱藏是指派生類中的函數(shù)把基類中相同名字的函數(shù)屏蔽掉了
覆蓋是指不同的函數(shù)使用相同的函數(shù)名,但是函數(shù)的參數(shù)個(gè)數(shù)或類型不同
解析:
重載:
只有在 同一類定義中的同名成員函數(shù)才存在重載關(guān)系 ,主要特點(diǎn)是 函數(shù)的參數(shù)類型和數(shù)目有所不同 ,但 不能出現(xiàn)函數(shù)參數(shù)的個(gè)數(shù)和類型均相同 ,僅僅依靠返回值類型不同來區(qū)分的函數(shù),這和普通函數(shù)的重載是完全一致的。另外,重載和成員函數(shù)是否是虛函數(shù)無關(guān)
覆蓋:
在派生類中覆蓋基類中的同名函數(shù),要求兩個(gè)函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型、返回類型都相同,且基類函數(shù)必須是虛函數(shù)。
隱藏:
派生類中的函數(shù)屏蔽了基類中的同名函數(shù),
2個(gè)函數(shù)參數(shù)相同,但基類函數(shù)不是虛函數(shù)(和覆蓋的區(qū)別在于基類函數(shù)是否是虛函數(shù))。2個(gè)函數(shù)參數(shù)不同,無論基類函數(shù)是否是虛函數(shù),基類函數(shù)都會(huì)被屏蔽(和重載的區(qū)別在于兩個(gè)函數(shù)不在同一類中)。
12、
char *p1;int64 *p2; p1=(char *)0x800000; p2=(int64 *)0x800000; char *a=p1+2 int64_t *b=p2+2那么a= 1 0x800002 ,b= 2 0x800010
解析:
我們定義指針的時(shí)候給指針一個(gè)類型就是為了方便指針的加減操作。p1是char類型指針,每個(gè)char占一個(gè)字節(jié),所以p1+2就是在p1的基礎(chǔ)上加2個(gè)char的長度,就是兩個(gè)字節(jié)。p2是指向64位int型的指針,所以p2+2就是p2加上兩個(gè)64位int的長度,也就是加上128位,即16個(gè)字節(jié)。用16進(jìn)制表示是0x10
所以a=0x800000+0x2=0x800002
b=0x800000+0x10=0x800010
指針里面存的是地址,所以指針的加減也是為了求得變化后的地址,即假設(shè)指針的類型是T,那么新的地址應(yīng)該就是原地址+sizeof(T)個(gè)字節(jié)后得到的地址,也就是說它加的實(shí)質(zhì)還是相應(yīng)的字節(jié)數(shù),而這個(gè)字節(jié)數(shù)是多少得看指針的類型,本題中第一個(gè)是char類型,那么加2就是倆個(gè)字節(jié),第二個(gè)是64位的int,那么相應(yīng)的指針類型就是8字節(jié),因?yàn)橹羔樉褪菫榱藢さ刂返?#xff0c;與cpu的位數(shù)有關(guān),一個(gè)字節(jié)8位,因此它加2就是加2*sizeof(int64),轉(zhuǎn)16進(jìn)制為0x1
13、 請(qǐng)問以下說法,哪個(gè)是正確的:(C)
每個(gè)類都有一個(gè)無參數(shù)的構(gòu)造函數(shù)。
每個(gè)類都有一個(gè)拷貝構(gòu)造的函數(shù)。
每個(gè)類能有多個(gè)構(gòu)造函數(shù)。
每個(gè)類能有多個(gè)析構(gòu)函數(shù)。
解析:
A:用戶自定義了構(gòu)造函數(shù)編譯器不會(huì)合成無參構(gòu)造函數(shù)
B:?一個(gè)類可以有多個(gè)拷貝構(gòu)造函數(shù)
class A{}; class B: public A{ public: B(const B&); B(const A&); };class A{}; class B: public A{ public: B(const B&); B(const A&); };D:一個(gè)類只能有一個(gè)析構(gòu)函數(shù)
14、選擇填空:(D)
#include void test(void *data) { unsigned int value = (此處應(yīng)填入) printf("%u", value); } using namespace std; int main() { unsigned int value = 10; test(&value); return 0; }*data
(unsigned int)(*data)
(unsigned*)data
*((unsigned int *)data)
解析:
注意,參數(shù)類型是void, 所以先要進(jìn)行指針轉(zhuǎn)換:(unsigned int *)然后再取值。
15、 在C++語言中,下列說法正確的是:(D)
inline函數(shù)表示編譯器一定會(huì)將函數(shù)體直接插入到調(diào)用此函數(shù)的地方,這樣可以加快程序的運(yùn)行速度
局部變量和全局變量不能重名
靜態(tài)局部變量內(nèi)存是在運(yùn)行期分配的,存儲(chǔ)在堆棧區(qū)
C++不是類型安全的語言
解析:
首先,可以排除B和C。B選項(xiàng),因?yàn)榫植孔兞亢腿肿兞渴强梢灾孛?#xff0c;而且一般來說在某個(gè)函數(shù)體內(nèi),局部變量是會(huì)覆蓋全局變量的。C選項(xiàng),靜態(tài)局部變量存在靜態(tài)存儲(chǔ)區(qū),而局部變量存儲(chǔ)在堆棧區(qū),確切的說是棧區(qū)。再看A選項(xiàng),內(nèi)聯(lián)函數(shù)與其他普通函數(shù)的區(qū)別是,內(nèi)聯(lián)函數(shù)在生成可執(zhí)行文件時(shí),其代碼塊是直接嵌入到調(diào)用處的,以此減少函數(shù)調(diào)用的開銷提高程序性能,它與宏很類似。但是,C++ primer 上明明白白的寫過這么一句話:內(nèi)聯(lián)說明(inline specification)對(duì)于編譯器來說只是一個(gè)建議,編譯器可以選擇忽略這個(gè)建議。也就是說,是否以嵌入式方式存在,是由編譯器決定的,并不是一定。最后看D選項(xiàng),什么叫類型安全的語言?本人很淺陋的認(rèn)識(shí)是:就C++而言,我們可以把0作為false,非零作為true。一個(gè)函數(shù)就算是bool類型的,我們還是可以返回int類型,并且自動(dòng)把0轉(zhuǎn)化成false,非零轉(zhuǎn)化成true。相比之下java不能把int類型轉(zhuǎn)化成bool類型。所以java是一種類型安全的語言,而C++并不是。 答案選D
16、關(guān)于Spring MVC的核心控制器DispatcherServlet的作用,以下說法錯(cuò)誤的是(C)?
它負(fù)責(zé)接收HTTP請(qǐng)求
加載配置文件
實(shí)現(xiàn)業(yè)務(wù)操作
初始化上下應(yīng)用對(duì)象ApplicationContext
解析:
DispatcherServlet是的servlet,所以肯定負(fù)責(zé)手http
可以在web.xml中配置spring-mvc.xml,用于加載配置信息。
當(dāng)沒有上下文時(shí),該它會(huì)新創(chuàng)建一個(gè)上下文。
DispatcherServlet用于分發(fā)http到具體的業(yè)務(wù)方法,所以實(shí)現(xiàn)業(yè)務(wù)的其實(shí)是具體的bean的方法。
17、以下代碼的輸出結(jié)果是?(A)
#define a 10void foo(); main(){printf("%d..",a); foo(); printf("%d",a); } void foo(){ #undef a #define a 50 }10..10
10..50
Error
0
解析:
選A,define在預(yù)處理階段就把main中的a全部替換為10了.
另外,不管是在某個(gè)函數(shù)內(nèi),還是在函數(shù)外,define都是從定義開始知道文件結(jié)尾,所以如果把foo函數(shù)放到main上面的話,則結(jié)果會(huì)是50 ,50
18、 1000 個(gè)瓶子中有一瓶毒藥,一只老鼠吃到毒藥一周之內(nèi)會(huì)死,如果要在一周之內(nèi)檢測出有毒藥的一瓶,問至少需要幾只老鼠?(B)
8
10
32
999
解析:
1000個(gè)瓶子編號(hào)1-1000, 每個(gè)編號(hào)會(huì)有一個(gè)10位的二進(jìn)制數(shù)字。 10只老鼠,依次喝掉所有二進(jìn)制第一位是1的瓶子,第二位是1的瓶子。。。第十位是1的瓶子。 一周之后,死掉的老鼠說明毒藥瓶子編號(hào)在對(duì)應(yīng)二進(jìn)制位置是1,否則是0。可以組合出毒藥的編號(hào)。(每位相同的混一起)
1000分為2組,每組500樣物品,取一點(diǎn)放在一起,每組放一只白鼠。 犧牲一只小白鼠 ,保留下500分可能是毒藥的,繼續(xù)分 2 , 250 3 , 125 4 , 62或63 5 , 31或32 6 , 15或16 7 , 7或8 8 , 3或4 9 , 1或2 10 。所以至少為10次(不能保證一周內(nèi)。)
19、有如下模板定義:
template <class T> T fun(T x,T y){ return x*x+y*y; }在下列對(duì)fun的調(diào)用中,錯(cuò)誤的是(B)
fun(1, 2)
fun(1.0, 2)
fun(2.0, 1.0)
fun<float>(1, 2.0)
解析:
模板函數(shù)應(yīng)該定義為(加返回值類似聲明):
template <class T> T fun(T x,T y){ return x*x+y*y;}然后這里T要求類型一致
A,類型一致,為int型
B,類型不一致,錯(cuò)我
C,類型一致,為folat型
D,用<float>進(jìn)行聲明,后面的實(shí)參會(huì)強(qiáng)制類型轉(zhuǎn)換為float,所以也是類型一致的。
20、對(duì)于以下代碼(C)
char * p= new char[100]p 和 new出來的內(nèi)存都在棧上
p 和 new出來的內(nèi)存都在堆上
p在棧上 new出來的在堆上
p在堆上 new出來的在棧上
解析:
動(dòng)態(tài)分配就在堆區(qū),其他都不在堆區(qū)
21、有字符序列 {Q,H,C,Y,P,A,M,S,R,D,F,X} ,新序列{F,H,C,D,P,A,M,Q,R,S,Y,X},是下列(B)____排序算法一趟掃描的結(jié)果。
二路歸并排序
快速排序
步長為 4 的希爾排序
步長為 2 的希爾排序
冒泡排序
堆排序
解析:
拿Q作為分割點(diǎn),快速排序一輪
二路歸并:H Q C Y A P M S D R F X
快速排序:F,H,C,D,P,A,M,Q,R,S,Y,X
冒泡排序:第一趟有A在第一位
堆排序:第一趟Y排在最后
如果是二路歸并的話,那么第一趟結(jié)束后每四個(gè)都是有序的
如果是快速排序的話,第一個(gè)元素將會(huì)被放到一個(gè)最準(zhǔn)確的位置,且第一個(gè)元素前面的都比它小,后面的都比它大
如果是shell排序的話,那么每個(gè)小分組內(nèi)將會(huì)是有序的
如果是堆排序的話,那么把它構(gòu)成一顆二叉樹的時(shí)候,該堆要么就是大根堆,要么就是小根堆
如果是冒泡的話,那么肯定會(huì)有數(shù)據(jù)下沉的動(dòng)作
22、下面代碼的輸出結(jié)果是?(C)
void main(void) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }1,2
2,4
2,5
出錯(cuò)
解析:
*(a+1)其實(shí)很簡單就是指a[1],輸出為2.
問題關(guān)鍵就在于第二個(gè)點(diǎn),*(ptr-1)輸出為多少?
解釋如下,&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加了一個(gè)整個(gè)a數(shù)組,偏移了整個(gè)數(shù)組a的大小(也就是5個(gè)int的大小)。所以int *ptr=(int *)(&a+1);其實(shí)ptr實(shí)際是&(a[5]),也就是a+5.
原因?yàn)楹文?#xff1f;
&a是數(shù)組指針,其類型為int(*)[5];
而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同,a是長度為5的int數(shù)組指針,所以要加5*sizeof(int),所以ptr實(shí)際是a[5],但是ptr與(&a+1)類型是不一樣的,這點(diǎn)非常重要,所以ptr-1只會(huì)減去sizeof(int*),a,&a的地址是一樣的,但意思就不一樣了,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5]。
23、 下列關(guān)于AOE網(wǎng)的敘述中,不正確的是(B)
關(guān)鍵活動(dòng)不按期完成就會(huì)影響整個(gè)工程的完成時(shí)間
任何一個(gè)關(guān)鍵活動(dòng)提前完成,那么整個(gè)工程將會(huì)提前完成
所有的關(guān)鍵活動(dòng)提前完成,那么整個(gè)工程將會(huì)提前完成
某些關(guān)鍵活動(dòng)若提前完成,那么整個(gè)工程將會(huì)提前完成
解析:
關(guān)鍵活動(dòng)組成了關(guān)鍵路徑,關(guān)鍵路徑是圖中的最長路徑,關(guān)鍵路徑長度代表整個(gè)工期的最短完成時(shí)間,關(guān)鍵活動(dòng)延期完成,必將導(dǎo)致關(guān)鍵路徑長度增加,即整個(gè)工期的最短完成時(shí)間增加,因此A正確。關(guān)鍵路徑并不唯一,當(dāng)有多條關(guān)鍵路徑存在時(shí),其中一條關(guān)鍵路徑上的關(guān)鍵活動(dòng)時(shí)間縮短,只能導(dǎo)致本條關(guān)鍵路徑變成非關(guān)鍵路徑,而無法縮短整個(gè)工期,因?yàn)槠渌P(guān)鍵路徑?jīng)]有變化,因此B項(xiàng)不正確。對(duì)于A,B兩項(xiàng)要搞懂的是,任何一條關(guān)鍵路徑上的關(guān)鍵活動(dòng)變長了,都會(huì)使這條關(guān)鍵路徑變成更長的關(guān)鍵路徑,并且導(dǎo)致其他關(guān)鍵路徑變成非關(guān)鍵路徑(如果關(guān)鍵路徑不唯一),因此整個(gè)工期延長。而某些關(guān)鍵活動(dòng)縮短則不一定縮短整個(gè)工期。理解了A,B兩項(xiàng),C,D就很容易理解了
24、int main(){fork()||fork();}共創(chuàng)建幾個(gè)進(jìn)程:_C____
1
2
3
4
5
6
解析:
fork()給子進(jìn)程返回一個(gè)零值,而給父進(jìn)程返回一個(gè)非零值;
在main這個(gè)主進(jìn)程中,首先執(zhí)行 fork() || fork(), 左邊的fork()返回一個(gè)非零值,根據(jù)||的短路原則,前面的表達(dá)式為真時(shí),后面的表達(dá)式不執(zhí)行,故包含main的這個(gè)主進(jìn)程創(chuàng)建了一個(gè)子進(jìn)程,
由于子進(jìn)程會(huì)復(fù)制父進(jìn)程,而且子進(jìn)程會(huì)根據(jù)其返回值繼續(xù)執(zhí)行,就是說,在子進(jìn)程中, fork() ||fork()這條語句左邊表達(dá)式的返回值是0, 所以||右邊的表達(dá)式要執(zhí)行,這時(shí)在子進(jìn)程中又創(chuàng)建了一個(gè)進(jìn)程,
即main進(jìn)程->子進(jìn)程->子進(jìn)程,一共創(chuàng)建了3個(gè)進(jìn)程。
25、下列說法錯(cuò)誤的有(ACD )
在類方法中可用this來調(diào)用本類的類方法
在類方法中調(diào)用本類的類方法時(shí)可直接調(diào)用
在類方法中只能調(diào)用本類中的類方法
在類方法中絕對(duì)不能調(diào)用實(shí)例方法
解析:
A:類方法是指類中被static修飾的方法,無this指針。
C:類方法是可以調(diào)用其他類的static方法的。
D:可以在類方法中生成實(shí)例對(duì)象再調(diào)用實(shí)例方法。(這個(gè)我也打錯(cuò)了,想想應(yīng)該是這個(gè)意思)
首先:
成員方法又稱為實(shí)例方法
靜態(tài)方法又稱為類方法
其次:
a,靜態(tài)方法中沒有this指針
c,可以通過類名作用域的方式調(diào)用Class::fun();
d,太絕對(duì)化了,在類中申請(qǐng)一個(gè)類對(duì)象或者參數(shù)傳遞一個(gè)對(duì)象或者指針都可以調(diào)用;
:this代表的是本類的對(duì)象,即實(shí)例。類方法之所以不能用this,是因?yàn)轭惙椒ㄊ请S著類的加載而加載,在對(duì)象創(chuàng)建之前就已經(jīng)存在。
A:類方法是類中被static修飾的方法,沒有this指針。C++的this指針:一個(gè)對(duì)象的this指針并不是對(duì)象本身的一部分,不會(huì)影響sizeof(對(duì)象)的結(jié)果。this作用域是在類內(nèi)部,當(dāng)在類的非靜態(tài)成員函數(shù)中訪問類的非靜態(tài)成員的時(shí)候,編譯器會(huì)自動(dòng)將對(duì)象本身的地址作為一個(gè)隱含參數(shù)傳遞給函數(shù)。
C:類方法是可以調(diào)用其他類的static方法的。
D:可以在類方法中生成實(shí)例對(duì)象再調(diào)用實(shí)例方法。
26、12個(gè)元素的排序數(shù)組進(jìn)行二分查找,每個(gè)元素被查找的概率是相等的,平均比較次數(shù)為 13 。37/12
解析:
平均查找長度公式為:ASL={[(n+1)/n]*log2^(n+1)}-1,也可以直接算出來,1*1+2*2+3*4+4*5=37,故其次數(shù)為37/12。
總結(jié)