您的位置:首页 > 编程语言 > C语言/C++

c语言笔面试题错题解析2

2016-11-10 18:38 197 查看
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(9) = x(7)+x(5)+1;

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是数据结构中的双向链表,因此他的内存空间可以是不连续的通过指针来进行数据的访问,这个特点使得他的随即存取变得非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以很好的支持任意地方的删除和插入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: