首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

昨天去面试C++,给了几道笔试题,都不会做,有哪个会啊该怎么解决

2013-10-21 
昨天去面试C++,给了几道笔试题,都不会做,有哪个会啊?用手机悄悄的拍了几道题 回来1、int(*s[10])(int)表示

昨天去面试C++,给了几道笔试题,都不会做,有哪个会啊?
用手机悄悄的拍了几道题 回来

1、int(*s[10])(int)表示什么意思?
2、 union V
  {
    struct X
    {
      unsigned char s1:2;
      unsigned char s2:3;
      unsigned char s3:4;   //这是什么意思啊?我从来没有这样子用过,见都没有见过啊
    }x; 
    unsigned char c;
  }v;
  v.c=100;
  printf("%d",v.x.s3); //输出多少?

3、写一个函数判断处理器存储模式是大端还是小端
4、模板在什么时候会实例化,以下模板会实例化多少次?
template <class T,int size=10>
class Array
{
 ....
};
void foo()
{
  array <int> arr1;
  array <char> arr4,arr5;
  array <int> arr2,arr3;
  array <double> arr6;
  array <char,50> arr7; 
}
5、动态执行库导出C++类库有什么缺点?
[解决办法]
1:首先看括号里面的(*s[10]),由[]的右结合,知道这先是一个数组,然后每个元素是一个指针,再看外面,左边是int,说明数组元素是一个int的指针,右边是(int),表示是一个函数,有一个整形形参.总结起来就是一个函数,函数的类(返回类型)型是一个具有10个具有int *类型元素的数组

2:这是位字段:类型 名称:宽度
如果定义了位字段,那么编译器就会给它分配一定的位数,比如unsigned char s3:3; 就是说s3的大小是3位二进制,就是说范围就是0~7,如果是:8的话,那范围就是0~511;
输出:3

=3=后面就不回了,C++不会...
[解决办法]
虽然不会但是mark一下等高手回答...
[解决办法]
3、写一个函数判断处理器存储模式是大端还是小端
   用一个union结构,中间放一个char和int,首先将int清0,然后对char写入一个非0值,
   读取char的值,看是否是你写入的值,如果不是,就是Big Endian,否则Little Endian.   

4、模板在什么时候会实例化,以下模板会实例化多少次?
   会实例化4次.char类型有2次.

5. 动态执行库导出C++类库有什么缺点?
   说不上来.
[解决办法]
1.
10个函数指针组成的数组?
2.
有人说是为预留空间,DCB结构中看到过
3.
不看书想不起来,Socket有个htons()可以比较,但是比较下来如果不一样是大端还是小端不知道
4.
4次
5.
可能无法被异构编译器使用,不确定

题目都很变态,mark
[解决办法]
1. s是一个数组。元素是函数指针,带一个int的参数,返回int
2. 考察位域。v未被初始化,v.x.s3在v的第二个字节(v共占2个字节)的值未知,所以结果随机。
3. int a = 0x01;  bool isBigEndian =  0 == *(char*)&a;
4. 共4次
  array <int> arr1; //array<int,10>
  array <char> arr4,arr5; //array<char,10>
  array <int> arr2,arr3; 
  array <double> arr6; //array<double,10>
  array <char,50> arr7; //array<char,50>
5. 导出的类必须是标准的内存布局,否则容易产生DLL灾难。 
[解决办法]
1楼的第一道题的解释有点错误, 首先看括号里面的(*s[10]),由[]的右结合,知道这先是一个数组,然后每个元素是一个指针,再看外面,左边是int,说明数组元素是一个int的指针,右边是(int),表示是一个函数,有一个整形形参

红色部分错了, 看外面时应该先结合圆括号, 所以应该是: s 是一个含有10元素的数组, 元素类型是一个指针, 指针指向一个函数, 函数的参数和返回值为都是int型. 
[解决办法]
第5个,可以考虑下二进制兼容的问题,dll灾难?
[解决办法]
第二个问题, 首先得知道什么是大端什么是小端. 例如int a = 0x12345678; 大端的内存从低到高每个字节分别为0x12,0x34,0x56,0x78,小端则正好相反.所以只要判断某个字节上的数值即可,如下:



bool IsLittleEndian()
{
int a = 0x1;//0x00000001,小端机内存数据为01 00 00 00 大端机内存数据为00 00 00 01
char*p = (char*)&a;
if((int)(*p) == 0)
return true;
else
return false;
}

[解决办法]
靠, 应该是第三个问题, 第二个问题也没见过,汗颜...
引用:
第二个问题, 首先得知道什么是大端什么是小端. 例如int a = 0x12345678; 大端的内存从低到高每个字节分别为0x12,0x34,0x56,0x78,小端则正好相反.所以只要判断某个字节上的数值即可,如下:

C/C++ code

bool IsLittleEndian()
{
    int a = 0x1;//0x00000001,小端机内存数据为01 00 00 ……

[解决办法]
1.s是一个包含10个元素的数组,每个元素都是函数指针,指向形参和返回值都是int型的函数。
2.位段对齐。相邻的多个同类型的数(带符号的与不带符号的,只要基本类型相同,也为相同的数),如果他们占用的位数不超过基本类型的大小,那么他们可作为一个整体来看待。不同类型的数要遵循各自的对齐方式。
v未被初始化,v.x.s3在v的第二个字节(v共占2个字节)的值未知,所以结果随机。(引用5楼的说法)
3.

int checkCPU()  

{  

 {  

  union w  

  {   

   int a;  

   char b;  

  } c;  

  c.a = 1;  

  return (c.b == 1);  //是小端的话返回非0值,大端返回0

 }  
}  

其他不会 
[解决办法]
引用:
第二个问题, 首先得知道什么是大端什么是小端. 例如int a = 0x12345678; 大端的内存从低到高每个字节分别为0x12,0x34,0x56,0x78,小端则正好相反.所以只要判断某个字节上的数值即可,如下:
C/C++ code

bool IsLittleEndian()
{
    int a = 0x1;//0x00000001,小端机内存数据为01 00 00 00 大……

说得不错  我也这么想的

热点排行