就业数据资源平台
当前位置:首页 > 笔试经验
MTK笔试总结


小编我很久没在应届毕业生求职网上发表文章张了,下面就让我来跟大家谈谈我的MTK笔试心得吧!


今年年要开始找工作了,本着积累经验的目的,跑去做了下MTK的笔试题,笔试的内容主要是C++。


因为开发中一直使用C++,而且对C++里的高级特性:面向对象,模板等都比较熟悉,还没事喜欢研究下STL,BOOST,所以对自己的C++水平比较自信,因此事先也没做任何准备,就直接去笔试了。本来笔试完了后觉得题目蛮简单的,但是本着认真学习的态度回来后把题目都上机试验了下,结果一下就悲剧了,错的体无完服啊。


总结了一下:


   1。认真对待,不要小看了笔试题目:做题的时候心想这些笔试题目都很简单啊,很多题目都是扫了一眼就立即写出了答案,结果回来后才发现这些题目都设置了陷阱,让你掉进去就出不来了。

   2。C++基础不够扎实。枉我还一天到晚的研究C++的高级特性,结果很多基础的知识却都是一知半解。

特将此次笔试的一些心得和体会记录于此,好提醒自己。下面主要分析几个我做错的题目。题目并非与原题完全一致。

题目一:

int a=10,b=6;

cout<<a+b<<" "<<a++<<" "<<b++;

请说出上述语句的执行结果。

很多人看过这段代码后估计都会直接就写上了 16 10 6 这样的结果吧,但上机实验的输出结果是: 18 10 6

为什么会出现这样的结果,下面是我的分析过程,如果有不对的地方请大家指正。

为了跟踪代码的执行步骤,我设计了一个类X,这个类是对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;

};

然后执行以下代码:


    X a(10),b(6);

    cout<<"sum:" <<a+b<<" a:"<<a++<<" b:"<<b++<<endl;


使用GCC4。5编译后,代码的执行结果如下:


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

我们来简单分析下这个执行过程:


construct 10

construct 6  //这两行输出对应于 X a(10),b(6);


operator ++(post) 6

copy construct 6 //表明首先执行了  cout<<"sum:" <<a+b<<" a:"<<a++<<" b:"<<b++<<endl;这句中的 b++这个表达式,

                              b++这个表达式返回了一个值为6的临时对象,而b本身则变成了7。

operator ++(post) 10

copy construct 10  //这句的分析同上


operator +

construct 18 //对应于表达式 a+b ,可以看到,此时的a和b已经变成了11和7。表达式返回了一个值为18的临时对象。

sum:18 a:10 b:6 //输出的结果,从结果可以看出,实际上打印出的值分别为 a+b,a++和b++三个表达式所返回的临时变量。

desconstruct 18 //a+b 表达式返回的临时变量的析构

desconstruct 10 //a++ 表达式返回的临时变量的析构

desconstruct 6 //b++表达式返回的临时变量的析构

desconstruct 7 //变量a 的析构

desconstruct 11  //变量b的析构


真相大白了。为什么编译器会这样来编译这个表达式呢?

下面2楼的夜风同学给出了正确答案。。为了不误导后面的同学,特此编辑掉。。


上述实验的环境均为GCC4。5  据同学说VS2010执行的结果在DEBUG下和RELEASE下居然分别为:16 10 6 和18 10 6,不过我没有去验证过,有兴趣的同学可以去验证并分析一下。

做这样一道题还是让我收获很多,巩固了C++的基础。

今天就写道这里,后面有时间会陆续放出对其他“陷阱”题目的分析。

 


 


还有更多值得大家阅读的笔试经验分享,大家敬请关注应届毕业生求职网:百纳笔试经验   百纳笔试经验   泰隆银行笔试经验   友邦保险笔经


就业数据资源平台