2013完美世界校招笔试题及答案

来源:互联网 发布:骚气的诗词 知乎 编辑:程序博客网 时间:2024/04/30 19:31

1、设有矩阵A1(30*35)、A2(35*15)、A3(15*5)、A4(5*10),M=A1*A2*A3*A4,下列组合计算M所需数乘次数最少的是:D
A、(A1(A2(A3A4)))    B、(A1((A2A3)A4))   C、((A1A2)(A3A4))    D、((A1(A2A3))A4)  E、(((A1A2)A3)A4)

解析:比较笨的方法。A的次数:35^2*30*15^2*10^3*5,B的次数:35^3*30*15*10^2*5^2,C的次数:35*30^2*15^3*10^2*5,D的次数:35^2*30^2*15*10*5^3,E的次数:35*30^3*15^2*10*5^2。比较这五个数,发现D是最小的。
2、在32位机器上,有如下代码:

char array[] = "abcdefg";  

printf("%d\n",sizeof(array));          

char *p = "abcdefg";  

printf("%d\n",sizeof(p));             

void func(char p[10])  

{  

    printf("%d\n",sizeof(p));        

 }  

void func(char (&p)[10])  

{  

    printf("%d\n",sizeof(p));        

}  

int main(void)  

{  

    printf("%d\n",sizeof(char[2]));       

    printf("%d\n",sizeof(char&));       

    return 0;  

}  

其输出结果依次为:D
A、8   4   4  10  2  1
B、4   4   4  10  4  1
C、8   4   4  10  2  4
D、8   4   4  4  2  1
E、8   4   4  10  4  4
F、以上答案都不对
3、

CONTAINER::iterator iter , tempIt;  

for(iter = cont.begin() ; iter != cont.end() ; )  

{  

    tempIt = iter;  

    ++iter;  

    cont.erase(tempIt);  

}  

假设cont是一个CONTAINER的示例,里面包含数个元素,那么当CONTAINER为:
1、vector<int>
2、list<int>
3、map<int , int>
4、deque<int>
会导致上面的代码片段崩溃的CONTAINER类型是:A
A、1,4     B、2,3   C、1,3      D、2,4
解析:vector和deque是用数组实现的,在执行上述操作时,迭代器会失效,代码片段会崩溃;而list和map是用链表实现的,删除时只会影响删除点的迭代器,对别的迭代器没有影响,不会崩溃。
4、以下代码E

class classA  

{  

public:  

    classA()  

    {  

        clear();  

    }  

    virtual ~classA()  

    {  

    }  

    void clear()  

    {  

        memset(this , 0 , sizeof(*this));  

    }  

    virtual void func()  

    {  

        printf("func\n");  

    }  

};  

class classB : public classA  

{  

};  

  

int main(void)  

{  

    classA oa;  

    classB ob;  

    classA * pa0 = &oa;  

    classA * pa1 = &ob;  

    classB * pb = &ob;  

  

    oa.func();         // 1  

    ob.func();         // 2  

    pa0->func();       // 3  

    pa1->func();       // 4  

    pb->func();        // 5  

  

    return 0;  

}  

A、func             func        执行出错      执行出错        func  
B、执行出错         func       执行出错      执行出错        func 
C、执行出错      执行出错      执行出错      执行出错      执行出错
D、func             func          func           func          func
E、func             func        执行出错          func         func
F、以上选项都不对

解析:用VS2010运行,可以得到结果是E,但还是不理解为什么。
5、在32位系统中

class CBase  

{  

public:  

    void func()  

    {  

        Print();  

    }  

    virtual void Print()  

    {  

        cout<<"CBase::Print"<<endl;  

    }  

};  

class CDerived : public CBase  

{  

public:  

    virtual void Print()  

    {  

        cout<<"CDerived::Print"<<endl;  

    }  

};  

  

int main(void)  

{  

    CDerived c;  

    CBase *p = &c;  

    return 0;  

}  

请问:
sizeof(*p)的值是多少? B
A、1    B、4     C、8   D、12
p->Print(); 和 c.func();的输出分别是?D
A、CBase::Print    CBase::Print     B、CBase::Print     CDerived::Print
C、CDerived::Print  CBase::Print    D、CDerived::Print CDerived::Print

解析:sizeof(*p)即是求c的大小,虚函数会占据4个字节。

p->Print()肯定是会调用子类的方法,c是子类对象,在调用print函数时,会先在子类中寻找函数,只有在子类中没有找到时,才会去父类中寻找。所以D正确。
6、

struct Thing  

{  

    int valueA;  

    const int valueB;  

};  

Thing t;  

t的成员变量valueA 和 valueB 的值分别为:C
A、0 0     B、垃圾值  0     C、无法运行     D、垃圾值  垃圾值

解析:valueB是const类型,必须要先初始化才行。
7、for(int x = 0 , y = 0; !x && y <= 5 ; y++)语句执行循环的次数是:C
A、0       B、5        C、6       D、无数次
8、在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为B
A、0        B、1         C、2        D、4

解析:空类的大小为1。
9、以下对函数指针的定义,哪些是正确的:A
A、typedef  int  (*fun_ptr)(int , int);      B、typedef  int  *(fun_ptr)(int ,int); 
C、typedef  int  (fun_ptr*)(int , int);      D、typedef  *int  (fun_ptr)(int , int); 

解析:如果*被()包含就是函数指针,如果没有被包含,就是指针函数。
10、在32位系统中,下面结构体C

struct st  

{  

    char ch , *ptr;  

    union  

    {  

        short a , b;  

        unsigned int c : 2 , d : 1;  

    };  

    bool f;  

    struct st *next;  

};  

的大小是:
A、14字节       B、16字节      C、20字节       D、24字节

解析:ch占1个字节,ptr占4个字节,union占4个字节,bool占1个字节,next占4个字节,总共会占4*5=20个字节。
11、32位小端字节序的机器上,如下代码:C

char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};  

short *pshort = (short *)array;  

int *pint = (int *)array;  

int64 *pint64 = (int64 *)array;  

printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));  

输出结果为:
A、0x201 , 0x403 , 0x807060504030201 , 0x0    B、0x201, 0x605 , 0x807060504030201 , 0x0   
C、0x201 , 0x605 , 0x4030201 , 0x8070605      D、0x102 , 0x506 , 0x102030405060708 , 0x0  
E、0x102 , 0x304 , 0x1020304 , 0x5060708         F、0x201 , 0x605 , 0x4030201 , 0x6050403

解析:小端是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。char是1个字节,short是2个字节,int是4个字节,int64是8个字节。*pshort是0x201,*(pshort+2)是0x605,32位系统,因此*pint64会分两次输出,先输出0x40302010,再输出0x8070605,*(pint+2)不会输出值。
12、有关引用,下列说法错误的是:B

A、引用定义时必须初始化
B、类的非静态引用成员变量不需要在构造函数中初始化
C、数组可以有引用,但没有引用数组
D、public派生对象可以初始化基类类型的引用
E、整型数据的常引用可以直接用数值初始化
F、以上选项都不是
13、Windows PE文件装载到的地址为:D
A、0x0030000    B、0x0040000    C、任意地址   D、0x10000000    
14、以下哪些对象可用于Windows进程间通信:ABCD
A、事件    B、临界区    C、互斥量    D、共享内存

0 0