程序员面试宝典二

来源:互联网 发布:出租车gps轨迹数据集 编辑:程序博客网 时间:2024/05/29 21:29

1、下面程序结果

unsigned int a=0xfffffff7;unsigned char i=(unsigned char)a;   //发生截断    char *b=(char *)&a;  //指针转换printf("%08x,%08x\n",i,*b);  //000000f7,fffffff7
int f(int x,int y){return (x&y)+((x^y)>>1);  //&操作是取相同的位,结果是相同位两者和的一半,^操作是取不同的位,右移相当于除以2,结果是不同位两者和的一半}

2、C++调用被C编译器编译后的函数,为什么要加上extern "C"?

    C++支持函数重载,C语言不支持函数重载。函数被C++编译之后在库中的名字和C语言不同。例如函数原型为void foo(int x,int y),该函数被C编译器编译后在库中的名字为_foo,而C++编译器编译之后则会产生像_foo_int_int之类的名字。

3、用一个宏定义求一个结构体struc里某个变量相对struc的偏移量

#include "stdafx.h"#include "iostream.h"#include "stdlib.h"#define PARAM_OFFSET(struc, Field) ((size_t)&(((struc *)0)->Field)) //结构体struc中的某个变量相对struc的偏移量,size_t便于移植struct testStruct{    char a;short b;int c;char path[1024];int d;}; int main(int argc, char* argv[]){    printf("a's offset:%d, b's offset:%d,c's offset:%d,path's offset:%d,c's d:%d\n",     PARAM_OFFSET(testStruct,a),     //0     PARAM_OFFSET(testStruct,b),     //2 (char a)     PARAM_OFFSET(testStruct,c),     //4 (2 + short b)     PARAM_OFFSET(testStruct,path),  //8 (4 + int c)     PARAM_OFFSET(testStruct,d));    //1032 (8 + char path[1024])printf("size is : %d\n",sizeof(testStruct));  //4+4+1024+4=1036return 0;}

4、以空间代价换取时间

     1)计数排序
     2)inline函数

5、空类的大小是1,单一继承、多重继承的空类大小都是1,具体原因没有查清楚。

     虚继承的空类因为涉及虚表,大小为4。

6、分析程序运行结果

#include "stdafx.h"#include "iostream.h"#include "stdlib.h"class A{public:A(){m_a=1;m_b=2;}void func(){printf("%d%d\n",m_a,m_b);}private:int m_a;int m_b;};class B{public:B(){m_c=3;}void func(){printf("%d\n",m_c);}private:int m_c;};int main(int argc, char* argv[]){    A a;B *b=(B*)(&a);  //野蛮的指针转换,然后使得b的成员变量m_c=m_a=1b->func(); //1return 0;}

7、空指针和迷途指针

    当delete一个指针p时,仅仅是释放该指针所指向的内存空间,但指针本身依然存在,这时它就是一个迷途指针。

    当使用p=0后,迷途指针就变成了空指针。

    使用迷途指针或者空指针都是非法的,而且有可能造成程序的崩溃,但是空指针造成的崩溃相对于迷途指针的崩溃是一种可预料的崩溃。

8、

原创粉丝点击