天地融面试题

1、

  1. int a;  
  2. #define M(x,y) (x/y)  
  3. a = M(4+2, 3)  
  4. a=?  

这是考察宏定义的知识,宏定义就是简单的替换。

M(4+2, 3)的展开式为4+2/3。

所以a=4。

下面的这两个例子可能有助于更好的理解:

#define m(x) x*x*(x+1)
int a=2,b=3;
m(a+b)的结果是26
m(a+b)的展开式是a+b*a+b*(a+b+1),结果是26
#define m(x) (x)*(x)*(x+1)
int a=2,b=3;
m(a+b)的结果是150
m(a+b)展开式是(a+b)*(a+b)*(a+b+1)结果是5*5*6=150

2、

  1. int f(int x)  
  2. {  
  3.       static int k = 0;  
  4.       x += k++;  
  5.       return x;  
  6. }  
  7. int i;  
  8. i = f(3)*f(2);  
  9. i = ?  

k是一个静态变量,它的作用相当于全局变量,但是它定义在了函数内部,外部是不可见的,不可见的全局静态变量。

所以执行完f(3)之后,k=1,再执行f(2)时,k的值还是1,执行完f(2)后,k=2.

最后答案是 9

3、在X86,32位环境下,下面程序的输出结果是什么?

  1. double dArrary[2] = {4, 8}, *p, *q;  
  2. p = &dArrary[0];  
  3. q = p+1;  
  4. cout<<q-p<<endl;  
  5. cout<<(int)q-(int)p<<endl;  

这个题考查 指针类型和指针的加减。这个题需要在 visual studio下面执行才能不报错

p,q是指针,即指针变量,他们的类型是double*  ,所以他们的在内存中的step是8

q-p表示元素相差的个数,强制转换为地址  (int)q-(int)p表示把两个元素的地址值相减。

最后答案是   1 和 8

4、计算下列sizeof的值。

  1. char str[] = "http://www.tendyron.com/";  
  2. char *p = str;  
  3. int n = 10;  
  4. sizeof(str) = 25  
  5. sizeof(p) = 4  
  6. sizeof(n) = 4  
  7. void Foo(char str[100]){  
  8.   sizeof(str) = 4;  
  9. void *p = malloc(100);  
  10. sizeof(p) = 4;  


因为Foo只是一个函数,所有传递的都是数组的首地址。
在32位机器上,无论什么指针都占4个字节,包括void *类型。

5、下面程序输出什么?

  1. void Foo(char **p, int num)  
  2. {  
  3.     *p = (char *)malloc(num);     
  4. }  
  5. void Test(void)  
  6. {  
  7.     char *str = NULL;  
  8.     Foo(&str,100);  
  9.     strcpy(str, "hello");  
  10.     printf("%s", str);  
  11. }  

输出hello。

6、下面的程序输出什么?

  1. void Test(void)  
  2. {  
  3.     char *str = (char *)malloc(100);  
  4.     strcpy(str, "world");  
  5.     free(str);  
  6.     if(str != NULL)  
  7.     {  
  8.         strcpy(str, "world");  
  9.         printf("%s", str);  
  10.     }  
  11. }  

free(str)后必须手动将str置为NULL,否则它并不是指向NULL。

free(str);释放了指向的内存,str并不为NULL,而是一个随机数,俗称野指针。

free函数只是把malloc申请到的内存块中某个特殊的标志变了一下而已,并没有立刻就清空块中的数据。是否释放这块内存是操作系统自己来判断的,而且释放后是否会对内存块链进行调整,使内存碎片减少,都是用操作系统自己来进行的。

输出world。

7、下面程序的输出结果是什么?

  1. char *GetMemory()  
  2. {  
  3.     char p[] = "hello world";  
  4.     return p;  //这样返回是错误的  
  5. }  
  6. char *str = NULL;  
  7. str = GetMemory();  
  8. printf("%s", str);  
在函数内生命的这个字符数组p是局部变量,不能用来返回,所以输出的是一个乱码。

8、说明下面的程序有什么问题

  1. char *_strcpy(const char *strSrc)  
  2. {  
  3.     static char str[260];  
  4.     strcpy(str, strSrc);  
  5.     return str;  
  6. }  
这个问题我说不好,有会的可以解释一下。

9、一下两个循环的优先

  1. for(int i = 0; i < N; i++)  
  2. {  
  3.    if(condition)  
  4.       DoSomeThing();  
  5.    else  
  6.       DoOtherSomeThing();  
  7. }  
  8. if(condition)  
  9. {  
  10.    for(int i = 0; i < N; i++)  
  11.       DoSomething();  
  12. }  
  13. else  
  14. {  
  15.    for(int i = 0; i < N; i++)  
  16.       DoOtherSomething();  
  17. }  

10、简答Windows平台动态链接库的两种调用方式,以及静态库和动态库的区别。

11、已知链表结点head,写一个函数把这个链表逆序,结构如下

  1. strcut Node  
  2. {  
  3.    int data;  
  4.    Node *next  
  5. };  
  6. typedef struct Node Node;  

12、在32位系统上,用程序将16进制字符串,如“FE1234”转化为一个长整型。

13、写一函数IsBigEndian,判断计算机的字节存储顺序是升序还是降序。

14、有28个人买水,3个空瓶可以换一瓶水,请问至少买多少瓶水?

15、教授从2到9的数字中选出两个,把和告诉甲,把积告诉乙,他们轮流猜这个数,甲说:我猜不出,乙说:我也猜不出,甲说:我猜到了,乙说:我也猜到了。请问这两个数是什么?

-------------------------------分析过程-------------------------------------

第一步甲说:“我猜不到”证明和的组合不唯一:满足条件的和:
    [15] 6+9,7+8
    [8] 2+6,3+5
    [7]  2+5,3+4
    [14] 5+9,6+8
    [10]  2+8,3+7,4+6
    [9] 2+7,3+6,4+5
    [12] 3+9,4+8,5+7
    [13] 4+9,5+8,6+7
    [11] 2+9,3+8,4+7,5+6

第二步乙说:“我猜不到”证明积的组合不唯一,满足条件的积:
    [24] 3×8,4×6
    [18] 2×9,3×6
    [12] 2×6,3×4

第三步甲说:“我猜到了”有以下几种情况:
2+6=8 2*6=12(和为8的情况,满足第二步)
3+5=8 3*5=15(和为8的情况,不满足第二步)

2+5=7 2*6=10(和为7的情况,不满足第二步)
3+4=7 3*4=12(和为7的情况,满足第二步)

2+8=10 2+8=16 (和为10的情况,不满足第二步)
3+7=10 3+7=21(和为10的情况,不满足第二步)
4+6=10 4+6=24(和为10的情况,满足第二步)

2+7=9 2*7=14(和为9的情况,不满足第二步)
3+6=9 3*6=18(和为9的情况,满足第二步)
4+5=9 4*5=20(和为9的情况,不满足第二步)

7+8=15 7*8=56(和为15的的情况,不满足第二步)
6+9=15 6*9=54(和为15的情况,不满足第二步)
和为其它值的情况与和为15的的情况类似.
第三步甲说:“我猜到了”证明组合可能是: 2-6 3-4 4-6 3-6

第四步乙说:“我猜到了”有以下几种情况:
如果12,组合可能为2-6,3-4, 2-6,3-4组合的情况下第三步有可能, 所以是乙在第四步不可能猜到
如果18,组合可能为2-9,3-6, 2-9组合的情况下第三步不可能,3-6组合情况下第三步有可能, 所以乙在第四步能确定3-6是唯一的可能,即充分必要条件,所以说猜到了.
如果24,组合可能为3-8,4-6, 3-8组合的情况下第三步不可能,4-6组合情况下第三步有可能, 所以乙在第四步能确定4-6是唯一的可能,即充分必要条件,所以说猜到了.
第四步乙说:“我猜到了”证明组合可能是: 3-6(和为9,积为18) 4-6(和为10,积为24) 中的一种.

最终答案3-6或4-6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值