免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: richardhesidu
打印 上一主题 下一主题

如何才算是精通c语言 [复制链接]

论坛徽章:
0
91 [报告]
发表于 2006-12-05 12:06 |只看该作者
原帖由 塑料袋 于 2006-12-5 09:53 发表
C语言我想大概有一星期,就能学到精通C语言这个程度了吧。

当然,精通用C语言写程序,又是另外一个问题,属于有中国特色的知识水平掌握程度,类似于共产主义,大跃进,亩产上万斤......


很不错啊...

论坛徽章:
0
92 [报告]
发表于 2006-12-05 14:18 |只看该作者
原帖由 converse 于 2006-2-28 10:20 发表
我指的是“纯 C 语言”其他一律非 C 语言知识的不算,包括和数据结构、算法、系统、网络有关的所有所有
C 语言就是简简单单的语法组成的,仅此而已


如果你认为这样就是你所谓的C语言,我觉得你对C的认识 ...

我是初学者。我试一试解释一下。不对的话请大家指正。


  1. 1.下面几个语句是什么意思:
  2. typedef int (*f)(void)[5];
  3. 答:
  4. 这个我也不知道是什么东西?是不是lz写错了。还是我孤陋寡闻。
  5. char *(*c[10])(int **);
  6. 答:
  7. 这个应该是函数指针的数组。
  8. 函数的原型是 char * func_name(int **)
  9. 如果你读过《c专家编程》,解析这个应该不是难事。

  10. 2.这个宏的含义是什么:
  11. #define OFFSET(structure, member)  ((int) &((structure *)0)->member)
  12. 原理又是什么?
  13. 答:
  14. 这个宏应该是取得结构体内变量相对结构体起始位置的偏移量。
  15. 原理:
  16. 就是整数是可以跟指针变量相互转换的。

  17. 注:
  18. 我刚才看见某人说这个在c下编译通不过。只能在在c++下编译通过。
  19. 这纯属胡扯。是用的不对吧!
  20. printf("s1 = [%d]\n",  OFFSET(struct data_s, s1));
  21. 编译通不过么?


  22. 3.从堆栈的角度给我解释一下为什么返回局部指针变量是危险的?
  23. 答:
  24. 这个问题就是复杂了,
  25. 进入函数前,都要建立当前函数的栈框架。
  26. 汇编指令:
  27.      pushl   %ebp
  28.         movl    %esp,%ebp

  29. 一个函数的返回,都要释放当前函数的栈框架。
  30. 汇编指令:
  31.      leave             //相当于:movl %ebp %esp
  32.                                          popl  %ebp;
  33.         ret                //函数返回

  34. 因为:movl %ebp %esp
  35.          popl  %ebp;
  36. 这两句指令,所以被调用函数的函数栈已经被释放了。现在的函数栈的调用函数的函数栈。
  37. 如果你返回一个指针并且该指针指向已经被释放的函数栈的变量地址,其结果将是无法预料的。

  38. 4.int t = (unsigned char)(-1);
  39. 此时t为多少?又是为什么呢?
  40. 答:
  41. 255
  42. 原因:
  43. 计算机中数值的标示统一为数值的补码
  44. -1的原码:
  45. 10000001
  46. -1的反码:
  47. 11111110
  48. -1的补码
  49. 11111111

  50. 那么11111111表示的unsigned char类型的数值是多少。大概大家都知道吧。
  51. 注:我不知道为什么有人说这不符合标准。难道标准连这样基本的东西都不支持么?
  52. 还是根本不知道怎么回事,在这里故作高深。


  53. 5.C中到处存在的指针强制转换,它的原理又是什么呢?为什么我这样做没有问题:
  54. int t = 1;
  55. void *p = (void*)&t;
  56. int *p1 = (int *)p;
  57. 这里,t的指针经过几次转换,到p1的时候还是能够正确的读出数值,为什么?
  58. 答:
  59. 指针的强制类型转换的原理:
  60. 指针实质就是:内存的地址+内存中数据类型解释(即:指针的步长)
  61. 指针的强制类型转换对内存的地址是不会改变的,改变的就是对内存中数据的类型解释。
  62. 如果明白这个原理,
  63. 上面的问题的答案就是不得而知了。

复制代码

论坛徽章:
0
93 [报告]
发表于 2006-12-05 15:47 |只看该作者
汗,这个帖子大家就不要再顶了吧,当时气盛和白金搞得很不愉快,还好事情都过去了~~

论坛徽章:
0
94 [报告]
发表于 2006-12-05 17:06 |只看该作者
原帖由 flw2 于 2006-2-28 11:35 发表
去看看C是怎么产生的,为什么会在那个时候产生C语言吧。
在高手看来C比汇编就是方便些。至于怎么算精通,确实不好说,涉及太多了,不是语言本身。
楼主就是想看看这个概念在招聘中意味什么,如果你直接说,我实 ...


如果你直接说,我实现了我机器中的标准库函数并完全取代编译器的。


太难了吧,大师。。。:em11::em11::em11:

论坛徽章:
0
95 [报告]
发表于 2006-12-06 22:21 |只看该作者
怎样才算”精通C语言“, 问题如果不严格介定的话,只能是见仁见智了

论坛徽章:
0
96 [报告]
发表于 2006-12-06 23:46 |只看该作者
我最近也在思考这个问题。。
但是没有思路

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
97 [报告]
发表于 2006-12-07 10:40 |只看该作者
凑个热闹,c之类的语言都是工具而已,用得多了,也就熟了。任何语法都会被编译器过滤一遍。由各个语句组成的代码段,每个人的实现方式会因人而异,尤其是在一些非关键场合,更是如此。程序是思想的延伸,不在乎表现方式,而在于表现内容。所有的语言都是一种表现方式。
就如前面提到的,精通只是相对,个人认为只要能够熟练应用就可以,没必要将各种古怪的语句一一掌握。如一些bt的语句 "c = a+++++b;"之类的,有哪个程序会用,即使用,可读性也糟糕之极。程序也是要给他人看的,这是一种合作精神。

论坛徽章:
0
98 [报告]
发表于 2012-04-05 20:55 |只看该作者
lol 精通哪来的标准啊,都是瞎搞
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP