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、