程序员面试宝典一

时间:2022-11-26 15:01:58

1、int i=i;   ?

     首先声明一个变量i,然后将变量i的值(未初始化)赋值给自己

2、下面代码的意义

void func(int x,int &count)
{
while(x)
{
count++;
x=x&(x-1); //求将x转换为二进制后包含1的个数
}
}

     求一个整数转换为二进制之后包含多少个1
3、printf在VC6.0下是自右向左运算的(好像跟编译器有关)

	int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123; //*ptr++123; ptr++;
printf("%d,%d\n",*ptr,*(++ptr)); //++ptr; *(ptr); *(ptr);

4、(int)a与(int&)a的区别

	float a=1.0f;
cout<<(int)a<<endl; //1
cout<<(int&)a<<endl; //很大的一个数
cout<<boolalpha<<((int)a==(int&)a)<<endl; //fasle

float b=0.0f;
cout<<(int)b<<endl; //0
cout<<(int&)b<<endl; //0
cout<<boolalpha<<((int)b==(int&)b)<<endl; //true     

      (int)a 是取a的整数部分      

      (int&)a是取a在内存中存储的二进制格式,然后转换成int数值

5、如何快速取一个整数的7倍(利用位运算的高效)

      x << 3  - x 

6、判断一个数是不是2的n次幂

     ( ( x & (x-1) == 0 ) && x != 0 )

7、找错题

struct S 
{
int i;
int * p;
};

int main()
{
S s;
int * p = &s.i; // &s.i的值实际就是 &s的值,p指向了结构体s的地址的起始位置
p[0] = 4;
p[1] = 3; // s.p指向0x00003
s.p = p; // s.p指向的是s的首地址,s.p[0]相当于s.i,s.p[1]相当于s.p
s.p[1] = 1; // s.p的值为1,也就是s.p指向内存的0x00001处,s.p[1]=*(s.p+1)=*(&s.i+1)=*(&s.p)=s.p=1
s.p[0] = 2; // s.p[0]=*(s.p+0)=*(1+0)=*1,s.p[0]=2的时候,访问地址为1的地方,而地址为1的内存不属于这个程序,出现访问非法内存的错误
return 0;
}