程序员面试宝典二
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、