• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-5  評論-31  文章-0  trackbacks-0
            今年要開始找工作了,本著積累經(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)  編輯 收藏 引用

            評論:
            # re: 做MTK筆試的總結(jié)(一)--C++ 運(yùn)算符優(yōu)先級 2011-08-13 19:50 | pansunyou
            確實(shí)輸出不同的結(jié)果:

            [VS2008] cl.exe 15.00.21022.08 DEBUG輸出16 10 6
            [VS2008] cl.exe 15.00.21022.08 RELEASE輸出18 10 6
            [UNIX SCO] CC 3.1 09/28/99 DEBUG/RELEASE輸出18 10 6
            gcc version 4.1.2 20070115 DEBUG/RELEASE輸出18 10 6
              回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一)--C++ 運(yùn)算符優(yōu)先級 2011-08-13 21:00 | 夜風(fēng)
            <<在同一語句中連續(xù)使用,其實(shí)本質(zhì)上是函數(shù)的復(fù)合調(diào)用
            cout<<a+b<<" "<<a++<<" "<<b++;
            本質(zhì)上是
            operator<<(operator<<(operator<<(cout,a+b),a++),b++)
            由于c函數(shù)參數(shù)傳遞順序是從右至左,所以參數(shù)的計(jì)算次序是:
            b++ //7
            a++ //11
            a+b //18
            cout<<18
            cout<<11 //應(yīng)該是10,因?yàn)橐呀?jīng)先入棧了
            cout<<7 //應(yīng)該是6  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一)--C++ 運(yùn)算符優(yōu)先級 2011-08-13 21:19 | right
            盡管這種問題有確定的答案,但是實(shí)際上永遠(yuǎn)不要寫這種代碼。  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一)--C++ 運(yùn)算符優(yōu)先級 2011-08-13 21:47 | 江浸月
            @夜風(fēng)
            原來如此,受教了。不過最后應(yīng)該是
            b++ //7
            a++ //11
            a+b //18
            cout<<18
            cout<<10
            cout<<6
            才對。  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-13 23:31 | 瘋狂的面包
            http://blog.csdn.net/luciferisnotsatan/article/details/6456696
            我來給大家一個(gè)鏈接 很好解析這個(gè)問題  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一)[未登錄] 2011-08-14 16:03 | a
            題目也太水了吧。
            第一題 就是 UB.
              回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-14 19:04 | 俺不是壞人
            未定義行為,結(jié)果多少都是正確的。  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-14 19:38 | 狂接
            UB吧  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-14 21:34 | ccsdu2009
            這樣的題目 只能說蛋疼  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-15 09:38 | 各個(gè)
            這種題純粹就是坑爹的,出這種題的人就是一SB  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一)[未登錄] 2011-08-15 12:39 | Chipset
            可以看出出題的人根本不懂C/C++,這樣的公司不去也罷。  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-15 22:58 | 夜風(fēng)
            @江浸月
            哦,對的,10和6已經(jīng)入棧了  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-15 23:07 | 夜風(fēng)
            @Chipset
            不見的,有可能題目的用意在于考察是否理解<<操作符的函數(shù)形式,還有函數(shù)參數(shù)入棧順序,如果這樣理解,還是比較有技術(shù)含量的  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-15 23:13 | 夜風(fēng)
            @夜風(fēng)
            如果不理解,還真有可能出現(xiàn)大問題,我曾經(jīng)就遇到過一個(gè)問題,后來看匯編代碼時(shí)才回憶起<<的二元函數(shù)形式  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-17 00:32 | 艸,蛋疼
            在VC10上release才是16 10 6!






































              回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-17 12:40 | dougulf
            正確答案應(yīng)該是:未定義行為!
            還問這種題目,如果面試的人期待的不是“未定義行為”的答案的話,只能說面試的人是在拿自己曾經(jīng)出過的丑事讓別人出丑而已。
              回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-29 15:02 | 夢在天涯
            MKT現(xiàn)在還在找???  回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-08-29 15:52 | song
            在HP C/aC++ B3910B A.06.15
            試驗(yàn)了下是16 10 6
              回復(fù)  更多評論
              
            # re: 做MTK筆試的總結(jié)(一) 2011-09-30 11:36 | chencj
            1、C函數(shù)參數(shù)的計(jì)算順序是不確定的,可以在C99文檔中找到(72頁),因此不同的編譯器處理可能會不一樣
            The order of evaluation of the function designator, the actual arguments, and
            subexpressions within the actual arguments is unspecified, but there is a sequence point
            before the actual call.
            2、這里的operator<<不是全局的二元操作符,而是ostream的成員運(yùn)算符,一般是要重載自定類的<<操作符時(shí),才會定義全局的二元操作符,而這里的cout是ostream。
            即cout<<a+b<<a++<<b++; 本質(zhì)上是:
            ((cout.operator<<(a+b)).operator<<(a++)).operator<<(b++);
            3、二樓的夜風(fēng)是正解
            以上供探討。  回復(fù)  更多評論
              
            久久精品国产乱子伦| 青青草国产成人久久91网| 丰满少妇人妻久久久久久4| 人妻丰满AV无码久久不卡| 一本一本久久aa综合精品| 亚洲人成精品久久久久| 亚洲人成网亚洲欧洲无码久久| 久久久久波多野结衣高潮| 亚洲精品乱码久久久久久蜜桃图片| 久久久精品国产免大香伊 | 久久精品国产精品国产精品污| 久久这里只有精品18| 久久精品国产亚洲av麻豆色欲 | 久久人人爽人人爽人人爽| 欧美黑人激情性久久| 午夜天堂av天堂久久久| av国内精品久久久久影院| 伊人久久大香线蕉精品| 久久高潮一级毛片免费| 伊人情人综合成人久久网小说| 国产精品久久久久蜜芽| 亚洲国产精品久久久天堂| 狠狠色丁香久久综合五月| 亚洲国产精品无码久久九九| 久久亚洲私人国产精品vA| 国产2021久久精品| 久久精品中文字幕一区| 久久99热精品| 久久久久久综合网天天| 久久国产精品99久久久久久老狼| 久久99国产精品成人欧美| 狠狠色噜噜色狠狠狠综合久久| 久久久91精品国产一区二区三区| 亚洲国产综合久久天堂 | 久久国产三级无码一区二区| 一本色道久久88综合日韩精品| AV无码久久久久不卡蜜桃| 久久久国产视频| 国产一区二区精品久久凹凸| 亚洲va中文字幕无码久久| 久久久久香蕉视频|