源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

非常经典的C语言趣味题目

  • 时间:2021-11-25 15:46 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:非常经典的C语言趣味题目
[url=http://stevenkobes.com/ctest.html]http://stevenkobes.com/ctest.html[/url] 在这个网站上发现一套很有趣的C语言测试题,如果你招聘C语言相关开发人员,或者正在学习C语言,很值得做一做。 如果没有做,下面内容暂时不要看,最好自己先完成一遍。 [img]http://files.jb51.net/file_images/article/201304/201304111014595.png[/img] OK,假设你做的答案没有完全正确,那你可以继续看下去了,否则,后面内容对你来说就是小菜一碟,不值得看。 [b]第一题:[/b] #include <setjmp.h> static jmp_buf buf; int main(void) { volatile int b = 3; if (setjmp(buf) != 0) { printf("%d\n", b); exit(0); } b = 5; longjmp(buf, 1); } 输出结果为A)3 B)5 C)0 D)都不是 答案为B,也就是输出5。 关键点在于理解setjmp以及longjmp,([url=http://en.wikipedia.org/wiki/Setjmp.h]http://en.wikipedia.org/wiki/Setjmp.h[/url] )第一次运行到setjmp,会设置jmp_buf,然后返回0。当调用longjmp时,会把longjmp里面的非0值作为setjmp的返回值返回(如果longjmp的value参数为0,setjmp恢复后返回1,也就是当恢复到setjmp存储点的时候,setjmp一定不会返回0)。 setjmp-longjmp组合的用处类似于游戏中的存盘读盘功能,经常被用于类似C++的异常恢复操作。 [b]第二题:[/b] struct node { int a; int b; int c; }; struct node s = { 3, 5, 6 }; struct node *pt = &s; printf("%d\n", *(int*)pt); 返回结果为3,这个算是比较简单,pt为指向结构s的指针,然后将pt转换为int指针,进行dereference,取出一个int值,那就是结构中第一个数。 我们将题目改动一下,如下代码
[url=http://sunxiunan.com/?p=1637]http://sunxiunan.com/?p=1637[/url] sizeof如果计算表达式,那么表达式是不会做计算的,也就是不管加加减减,sizeof就是针对i计算大小。在32位机器上,这个j应该为4。 我将代码扩展了一下,看看大家能不能想到结果:
[url=http://sunxiunan.com/?p=1637]http://sunxiunan.com/?p=1637[/url] 也提到过相关知识点,也就是p实际指向*(buf + 1 + 5),写的更诡异一些就是p=5[buf +1];也是同样结果。 第十四题: 类似十三题,也是把数组弄得有些诡异,(p += sizeof(int))[-1];相当于*(p + sizeof(int) + (-1))。 第十五题:
[u]复制代码[/u] 代码如下:
int ripple(int n, …) { int i, j, k; va_list p; k = 0; j = 1; va_start(p, n); for (; j < n; ++j) { i = va_arg(p, int); for (; i; i &= i – 1) ++k; } return k; } int main(void) { printf("%d\n", ripple(3, 5, 7)); return 0; }
这道题也是两个知识点,一个是可变参数函数定义以及如何实现,va_arg会把5,7依次取出来。另一个知识点是i &= i-1,实际上是计算了i二进制形式中1的个数,每次计算都会消减掉最低有效位上的1。比如7二进制表示为111。i &= i –1的计算结果依次为110,100, 000 (也就是0)。在hacker's Delights这本书里介绍了很多类似技巧。 第十六题:
[u]复制代码[/u] 代码如下:
int counter(int i) { static int count = 0; count = count + i; return count; } int main(void) { int i, j; for (i = 0; i <= 5; i++) j = counter(i); printf("%d\n", j); return 0; }
只要了解静态局部变量的真正内涵,这道题就是小菜一碟碟碟碟碟碟。。。。。。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部