技術(shù)人員詳解C++測試結(jié)果總結(jié)
無論如何,現(xiàn)在可用的C++編譯器實現(xiàn)已經(jīng)很豐富了,在Windows平臺上的實現(xiàn)就有若干種,比較常用的有Visual C++ 6.0附帶的C++編譯器實現(xiàn),和Borland C++ Builder附帶的C++測試實現(xiàn)。
簡單地說,就是在右移正數(shù)時高位補(bǔ)0、右移負(fù)數(shù)時則高位補(bǔ)1,而無符號右移操作符>>>在右移時不考慮符號問題,即無論右移正數(shù)還是負(fù)數(shù),其***位都是補(bǔ)0。無符號右移本質(zhì)上是將被右移的數(shù)所有存儲位都視為數(shù)據(jù)位,因此很容易想到,如果想在C++測試中實現(xiàn)無符號右移,可以先將擬進(jìn)行無符號右移的數(shù)轉(zhuǎn)換成無符號類型,然后執(zhí)行普通右移就可以了。
以下是在VS2003中編寫的驗證代碼:
- #include "stdafx.h"
- #include "iostream"
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- int nOrg;
- cout << "被移位數(shù):";
- cin >> nOrg;
- cout << "有符號右移2位:"
- << (nOrg >> 2 )
- << endl;
- unsigned int nuNum = (unsigned)nOrg;
- cout << "轉(zhuǎn)換為無符號數(shù):"
- << nuNum
- << endl;
- cout << "無符號右移2位:"
- << (nuNum >> 2 )
- << endl;
- return 0;
- }
一旦我們認(rèn)識了C++測試在一些領(lǐng)域是有需求的(值得學(xué)習(xí)和掌握的)這個問題之后,就可以接下來討論“怎樣正確學(xué)習(xí)和掌握C++”這個核心問題了。 其實,對于這個問題,Bjarne已經(jīng)宣傳了十年。早在99年的時候Bjarne就寫了“Learning C++ as A New Language”,并在好幾篇技術(shù)訪談(這里,這里,這里,還有這里)里面提到如何正確對待和使用C++中支持的多種抽象機(jī)制的問題。Andrew Koenig也寫了一本現(xiàn)代C++教程《Accelerated C++》(這本書后面還會提到)。
然而這么多年來,C++社群的狀況改善了嗎?就我所知,就算有改善,也是很小的。學(xué)習(xí)者還是盲目鉆語言細(xì)節(jié),只見樹木不見森林;網(wǎng)上還是彌漫著各種各樣的“技術(shù)”文章和不靠譜的“學(xué)習(xí)C++測試的XX個建議”;一些業(yè)界的有身份的專家還是在一本接一本的出語言孔乙己的書(寫一些普通程序員八輩子用不著的技巧和碰不著的角落);而業(yè)界真正使用C++的公司在面試的時候還總是問一些邊邊角角的細(xì)節(jié)問題。#t#
而不是考察編程的基本素養(yǎng)(不,掌握所有的語言細(xì)節(jié)也不能讓你成為一個合格的程序員)。這個面試?yán)砟钍清e誤的,估計其背后的推理應(yīng)該是“如果這個家伙不知道這個細(xì)節(jié),那么估計他對語言也熟悉不到哪兒去;而如果他知道,那么雖然他可能并不是好的程序員,但我們還是能夠就后一個問題進(jìn)一步測試的”,這個理念的問題在于,對語言熟悉到一定程度(什么程度后面會具體建議)就已經(jīng)可以很好的編程了(剩下的只需查查文檔);
而很多公司在C++測試“對語言熟悉程度”的時候走得明顯太遠(yuǎn)了(比如,問臨時對象生命期和析構(gòu)順序當(dāng)然是無可厚非的,但問如何避免一個類被拷貝或者如何避免其構(gòu)建在堆上?);當(dāng)然,有些語言知識是必須要提前掌握的,具體有哪些后面會提到,面試的時候并非不能問語言細(xì)節(jié),關(guān)鍵是“問哪些”。