代码改变世界

程序员面试宝典二

2012-08-17 17:52  javaspring  阅读(221)  评论(0编辑  收藏  举报

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=1036	
	return 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=1
	b->func(); //1

	return 0;
}

7、空指针和迷途指针

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

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

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

8、