想问一下各位,如果自学C的话有没有好的书推荐和好的方法,谈一下你们高手学习C的心得怎样。
我就来说两句吧!
C就如一把轻便、锋利的双刃剑,它是高手的必杀,却是新手的坟墓……我想,如此手法形容C虽然有些过分,但在2002年版的《C Traps and Pitfalls》就对此观点进行了淋漓尽致的阐述,写在这里以表赞同。
C这几年的备受争议也是必然的,一门从70年代逐渐进化而来的语言如今看来自然有许多缺陷,密文似的语法、宏、毫无约束的指针(已经有了专用名词,那就是大名鼎鼎的C指针)、极为灵活的控制逻辑、不严密的类型机制都加大了编程的难度,如此看来搞C编程很像玩视窗系统自带的扫雷游戏,不懂规则没有经验的新手很快就会搬起石头砸自己的脚。下面,让我们通过伟大的Hello,World来看看C的几个组成部分:
List
#include <stdio.h>
int main()
{
printf(“Hello,World!”);
return 0;
}
开头的stdio.h是一个C头文件,C头文件与C源代码文件并没有什么本质差别,通常用于保存函数库设计的函数声明、常数、宏以及结构定义,此后,通过预处理机制的配合,开发者就可以方便的使用那些函数库。此处的stdio.h包含有一些用于控制输入输出的函数声明,这些函数都归属于C标准库。C标准库是C发展过程中逐渐成形的一套常用函数的集合,此集合包含的函数又按照各自属性被归类并供给相应头文件,比如这里的stdio.h,可用于内存控制的stdlib.h,还有负责字符串处理的string.h。
对如上C程序进行编译时,编译器第一道工序就是启动预处理机制去处理各种预处理指示。C中的预处理指示都以#开头并用于常量与宏定义、C头文件插入以及条件编译,前面程序第一句源码的#include预处理指示就告诉预处理机制把stdio.h的内容纳入程序,其中也就包含了用于输出Hello,World!的printf函数的声明。再看看其他预处理指示,试着打开stdio.h,你可以发现其结构大致如下(取自TC2.0的实现):
#ifndef _SIZE_T
#define _SIZE_T
……
#endif
上面的#ifndef、#endif、#define都属于预处理指示,#define用于常量与宏的定义,#ifndef和#endif用于条件编译,如上对这些预处理指示的运用就避免了stdio.h被重复贴入程序。最后,main实现中的printf用于标准输出的格式化输出,其后的return则指示函数返回并提供返回值。
运用C所遇到的大多困难都并非来自语言本身的缺陷而是程序员自己的适应问题,正是这个原因,用C进行开发时经验变得尤其重要。一方面,经验来源于实践,但看一些介绍C编码习惯的书也很必要,否则全靠自己去实践只会过早抹杀掉你对C的兴趣。其实,当你习惯C后就会感受到他的简洁、灵巧与高效,当然,通过这句话我还想表达另一层意思,知道为何我用习惯去形容吗?要知道,C编程高手也会时不时落入C所固有的大量陷阱中,于是,一方面你要通过经验的积累去避免犯下一些常见错误,另一方面,若你采用C进行开发,那么麻烦是注定的,你应该把其视作C编程的一部分,而不是什么异常情况。
就我认为,你可以学习C,也可以用C去编写小程序玩。勤于上机,多多思考问题,而不是遇到问题就发问。