1.程序段的执行结果是:
#include <iostream>
using namespace std;
void func1(int &x)
{
x++;
}
void func2(int x)
{
x++;
}
int main()
{
int abc = 100; xyz = 13;
func1(xyz);
abc = xyz;
func2(abc);
printf("%d\n",abc);
}
func1的参数是引用,引用直接通过内存地址访问变量,可以通过该引用改变main函数中的xyz的值,而func2是传值参数,当func2函数结束时,局部变量x被释放,无法改变函数中的值,所以结果是14。
2.下面程序输出结果为?
#include <stdio.h>
void change( int *a,int &b,int c)
{
c=*a;
b=30;
*a=20;
}
int main()
{
int a=10,b= 20,c=30;
change(&a,b,c);
printf("%d%d%d",a,b,c);
return 0;
}
本题考察函数传参的形式:传值,传指针,传引用
传值:函数的参数会产生临时空间,函数结束就会释放空间,因此不会改变主函数中变量的值。
传指针:传递的是地址,将主函数中变量的地址传到函数中,而不会产生临时变量,所以会改变变量的值。
传引用:就是传递变量的别名,可以直接通过内存地址访问变量,因此会改变变量的值
所以结果为 20,30,30。
3.int Function(unsigned int n)
{
n = (n&0x55555555)+((n>>1)&0x55555555);
n = (n&0x33333333)+((n>>1)&0x33333333);
n = (n&0x0f0f0f0f)+((n>>1)&0x0f0f0f0f);
n = (n&0x00ff00ff)+((n>>1)&0x00ff00ff);
n = (n&0x0000ffff)+((n>>1)&0x0000ffff);
return n;
}
当输入参数为197时,函数返回多少?
这个算法是平行算法,用了分治法计算二进制数中1的个数;
n = (n&0x55555555)+((n>>1)&0x55555555); /*计算相邻的2位中有几个1*/
n = (n&0x33333333)+((n>>1)&0x33333333); /*计算相邻的4位中有几个1*/
n = (n&0x0f0f0f0f)+((n>>1)&0x0f0f0f0f); /*计算相邻的8位中有几个1*/
n = (n&0x00ff00ff)+((n>>1)&0x00ff00ff); /*计算相邻的16位中有几个1*/
n = (n&0x0000ffff)+((n>>1)&0x0000ffff); /*计算相邻的32位中有几个1*/
4.函数x的定义如下,问x(x(8))需要调用几次函数x(int n)?
int x(int n)
{
cnt++;
if(n<=3)
{
return 1;
}
else
{
return x(n-2)+x(n-4)+1;
}
}
首先x(8)=x(6)+x(4)+1 = 9;
x(6)= x(4)+x(2)+1;
x(4)=x(2)+x(0)+1;
x(4)=x(2)+x(0)+1;
有x(8) x(6) x(4) x(4) x(2) x(2) x(0) x(2) x(0)共9次调用函数。
x(7)= x(5)+x(3)+1;
x(5)=x(3)+x(2)+1;
x(5)=x(3)+x(2)+1;
有x(9) x(7) x(5) x(5) x(3) x(3) x(2) x(3) x(2)共9次调用函数。
所以x(x(8))共调用函数18次。
5.请问下列代码的输出结果又可能是那些?
#include <stdint.h>
#include <stdio.h>
union X
{
int32_t a;
struct
{
int16_t b;
int16_t c;
}
}
int main()
{
X x;
x.a = 0x20150810;
printf("%x,%x\n",x.b,x.c);
return 0;
}
如果按照大端模式存储:从低地址到高地址 20 15 08 10
输出从低地址到高地址 20 15 08 10
如果按照小端模式存储:从低地址到高地址 10 08 15 20
输出从高地址到低地址 08 10 20 15
6.有关vector 和list 的区别
vector和bulit-in数组类似,它拥有一段连续的内存空间并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于他的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外当该数组的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝,这都影响了vector的效率。
list是数据结构中的双向链表,因此他的内存空间可以是不连续的通过指针来进行数据的访问,这个特点使得他的随即存取变得非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以很好的支持任意地方的删除和插入。