一套帮助你理解C语言的测试题

发表于:2012-2-24 09:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Veda    来源:51Testing软件测试网采编

  在一个网站上发现一套很有趣的C语言测试题,如果你招聘C语言相关开发人员,或者正在学习C语言,很值得做一做。

  如果没有做,下面内容暂时不要看,最好自己先完成一遍。

  OK,假设你做的答案没有完全正确,那你可以继续看下去了,否则,后面内容对你来说就是小菜一碟,不值得看。

  第一题:

#include <setjmp.h>
static jmp_buf buf;
int main(void)
{
 volatile int b = 3;
 if (setjmp(buf) != 0)
 {
  printf("%dn", b);
  exit(0);
 }
 b = 5;
 longjmp(buf, 1);
}

  输出结果为A)3 B)5 C)0 D)都不是

  答案为B,也就是输出5。

  关键点在于理解setjmp以及longjmp,(http://en.wikipedia.org/wiki/Setjmp.h )第一次运行到setjmp,会设置jmp_buf,然后返回0。当调用longjmp时,会把longjmp里面的非0值作为setjmp的返回值返回(如果longjmp的value参数为0,setjmp恢复后返回1,也就是当恢复到setjmp存储点的时候,setjmp一定不会返回0)。

  setjmp-longjmp组合的用处类似于游戏中的存盘读盘功能,经常被用于类似C++的异常恢复操作。

  第二题:

struct node
{
 int a;     
    int b;     
    int c;
};
struct node s = { 3, 5, 6 };
struct node *pt = &s;
printf("%dn", *(int*)pt);

  返回结果为3,这个算是比较简单,pt为指向结构s的指针,然后将pt转换为int指针,进行dereference,取出一个int值,那就是结构中第一个数。

  我们将题目改动一下,如下代码:

struct node
{
 char a;  
    char b; 
    short c;  
    int d;
};
struct node s = { 3, 5, 6, 99 };
struct node *pt = &s;
printf("%Xn", *(int*)pt);

  需要注意的是一般32位C编译器都认为char是8bit,short是16bit,int为32bit,所以node在内存中应该正好是对齐的,也就是abc这几个成员之间没有空隙。最终结果应该为60503,如果不是,欢迎你告诉我你具体的编译环境以及硬件配置。

  第三题:

int foo(int x, int n){
 int val = 1;
 if (n > 0)
 {
  if (n % 2 == 1) val *= x;
  val *= foo(x * x, n / 2);
 }
 return val;
}

  这道题其实最简单的办法就是在纸上做一个推演计算,一步一步跑一下,就能得到答案了,这里面没有任何复杂的C语言概念。

  第四题:

int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
printf("%d %dn", *(a + 1), *(ptr – 1));

  这道题考的其实是指向数组的指针,&a是一个隐式的指向int [5]数组的指针,它和int* ptr是不一样的,如果真要定义这个指针,应该是int (*ptoa)[5]。所以ptoa每一次加一操作都相当于跨越int a[5]的内存步长(也就是5个int长度),也就是说&a + 1其实就是指向了a[5]这个位置,实际上内存里面这个位置是非法的,但是对ptr的强制转换导致了后面ptr-1的内存步长改为了1个int长度,所以ptr-1实际指向了a[4]。至于*(a+1)没什么好说的,值就是2。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号