今年要開始找工作了,本著積累經(jīng)驗(yàn)的目的,跑去做了下MTK的筆試題,筆試的內(nèi)容主要是C++。
因?yàn)殚_發(fā)中一直使用C++,而且對C++里的高級特性:面向?qū)ο?,模板等都比較熟悉,還沒事喜歡研究下STL,BOOST,所以對自己的C++水平比較自信,因此事先也沒做任何準(zhǔn)備,就直接去筆試了。本來筆試完了后覺得題目蠻簡單的,但是本著認(rèn)真學(xué)習(xí)的態(tài)度回來后把題目都上機(jī)試驗(yàn)了下,結(jié)果一下就悲劇了,錯(cuò)的體無完服啊。。。
總結(jié)了一下:
1。認(rèn)真對待,不要小看了筆試題目:做題的時(shí)候心想這些筆試題目都很簡單啊,很多題目都是掃了一眼就立即寫出了答案,結(jié)果回來后才發(fā)現(xiàn)這些題目都設(shè)置了陷阱,讓你掉進(jìn)去就出不來了。
2。C++基礎(chǔ)不夠扎實(shí)。枉我還一天到晚的研究C++的高級特性,結(jié)果很多基礎(chǔ)的知識卻都是一知半解。
特將此次筆試的一些心得和體會記錄于此,好提醒自己。下面主要分析幾個(gè)我做錯(cuò)的題目。題目并非與原題完全一致。
題目一:
int a=10,b=6;
cout<<a+b<<" "<<a++<<" "<<b++;
請說出上述語句的執(zhí)行結(jié)果。
很多人看過這段代碼后估計(jì)都會直接就寫上了 16 10 6 這樣的結(jié)果吧,但上機(jī)實(shí)驗(yàn)的輸出結(jié)果是: 18 10 6
為什么會出現(xiàn)這樣的結(jié)果,下面是我的分析過程,如果有不對的地方請大家指正。
為了跟蹤代碼的執(zhí)行步驟,我設(shè)計(jì)了一個(gè)類X,這個(gè)類是對int的模擬,行為方面與int基本一致,除了會打印出一些幫助我們理解的信息,代碼如下:
class X
{
public:
X(){cout<<"default construct"<<endl;}
X(int a):i(a){ cout<<"construct "<<i<<endl;}
~X(){ cout<<"desconstruct "<<i<<endl;}
X(const X& x):i(x.i)
{
cout<<"copy construct "<<i<<endl;
}
X& operator++()
{
cout<<"operator ++(pre) "<<i<<endl;
++i;
return *this;
}
const X operator++(int)
{
cout<<"operator ++(post) "<<i<<endl;
X x(*this);
++i;
return x;
}
X& operator=(int m)
{
cout<<"operator =(int)"<<endl;
i = m;
return *this;
}
X& operator=(const X& x)
{
cout<<"operator =(X)"<<endl;
i=x.i;
return *this;
}
/////////////////////////
friend ostream& operator<<(ostream& os,const X& x)
{
os<<x.i;
return os;
}
friend X operator+(const X& a,const X& b)
{
cout<<"operator +"<<endl;
return X(a.i+b.i);
}
//////////////////////////
public:
int i;
};
然后執(zhí)行以下代碼:
X a(10),b(6);
cout<<"sum:" <<a+b<<" a:"<<a++<<" b:"<<b++<<endl;
使用GCC4。5編譯后,代碼的執(zhí)行結(jié)果如下:
construct 10
construct 6
operator ++(post) 6
copy construct 6
operator ++(post) 10
copy construct 10
operator +
construct 18
sum:18 a:10 b:6
desconstruct 18
desconstruct 10
desconstruct 6
desconstruct 7
desconstruct 11
我們來簡單分析下這個(gè)執(zhí)行過程:
construct 10
construct 6 //這兩行輸出對應(yīng)于 X a(10),b(6);
operator ++(post) 6
copy construct 6 //表明首先執(zhí)行了 cout<<"sum:" <<a+b<<" a:"<<a++<<" b:"<<b++<<endl;這句中的 b++這個(gè)表達(dá)式,
b++這個(gè)表達(dá)式返回了一個(gè)值為6的臨時(shí)對象,而b本身則變成了7。
operator ++(post) 10
copy construct 10 //這句的分析同上
operator +
construct 18 //對應(yīng)于表達(dá)式 a+b ,可以看到,此時(shí)的a和b已經(jīng)變成了11和7。表達(dá)式返回了一個(gè)值為18的臨時(shí)對象。
sum:18 a:10 b:6 //輸出的結(jié)果,從結(jié)果可以看出,實(shí)際上打印出的值分別為 a+b,a++和b++三個(gè)表達(dá)式所返回的臨時(shí)變量。
desconstruct 18 //a+b 表達(dá)式返回的臨時(shí)變量的析構(gòu)
desconstruct 10 //a++ 表達(dá)式返回的臨時(shí)變量的析構(gòu)
desconstruct 6 //b++表達(dá)式返回的臨時(shí)變量的析構(gòu)
desconstruct 7 //變量a 的析構(gòu)
desconstruct 11 //變量b的析構(gòu)
真相大白了。為什么編譯器會這樣來編譯這個(gè)表達(dá)式呢?
下面2樓的夜風(fēng)同學(xué)給出了正確答案。。為了不誤導(dǎo)后面的同學(xué),特此編輯掉。。
上述實(shí)驗(yàn)的環(huán)境均為GCC4。5 據(jù)同學(xué)說VS2010執(zhí)行的結(jié)果在DEBUG下和RELEASE下居然分別為:16 10 6 和18 10 6,不過我沒有去驗(yàn)證過,有興趣的同學(xué)可以去驗(yàn)證并分析一下。
做這樣一道題還是讓我收獲很多,鞏固了C++的基礎(chǔ)。
今天就寫道這里,后面有時(shí)間會陸續(xù)放出對其他“陷阱”題目的分析。
(未完待續(xù))
posted on 2011-08-13 17:30
江浸月 閱讀(3258)
評論(19) 編輯 收藏 引用