一、什么是C语言
C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。
C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。
当前最新的C语言标准为 C11 ,在它之前的C语言标准为 C99。
C语言也是一个比较稀少的应用领域极为广泛的语言。比如编撰操作系统这些高难问题,只有C++、汇编语言可以做到。C语言可以编撰服务器端软件如Apache、Nginx,或者编撰GUI程序,如GTK。大多数程序语言的第一版是通过C语言实现,借助上面提及的“一次编撰处处编译”,最大的保证了这种程序语言的可移植性。在Web开发领域,C语言的应用相对较少,这也是一种抉择的结果,Web开发须要使用PHP、Ruby、Python这样的动态语言,可以快速上线快速更改,可以最大程度满足用户时时变化的需求,这也是C语言的短板。如果把程序语言的应用领域从硬件到管理软件、Web程序做一个很简略从下到上的排列,C语言适宜领域是比较底层紧靠硬件的部份,而新兴语言比较侧重于高层管理或则Web开发这些相对紧贴最终用户的领域。比较流行的混和开发模式是使用C语言编撰底层高性能部份代码或后台服务器代码,而使用动态语言如Python做后端开发,充分发挥它们各自的优势力量。
二、C语言学习方法
认真听课
阅读参考书
阅读代码
实际编撰调试
交流剖析
三、推荐图书
经典
与其他主流语言中常常有几部专著可谓不可取代的精典不同,C语言的世界里只有一本书拥有这样无上的地位,它其实就是C语言之父Dennis Ritchie和另一位技术专家Kernighan专著的这部不朽之作:
a) C程序设计语言(第2版·新版)Brian W.Kernighan, Dennis M.Ritchie徐宝文 李志 译 机械工业出版社
本书常常被人简称为“K&R C”(K和R分别是两位作者姓氏的头字母),它在程序设计语言图书中的地位几乎与C在程序设计语言中的地位相当。许多书开始用输出“Hello World!”作为第一个事例,就是从这儿来的。有意思的是,最近又有人批评这一惯例容易使中学生形成编程很容易的错觉,产生了许多后续问题。虽然也言之成理,但是总有些严苛了。
本书具有许多贝尔实验室大师们作品的一致优点,篇幅很小,但是内容却十分丰富,而且表述也十分清晰。与大部分father写的作品一样,它主要还是针对有一定编程经验的读者而写的,不是完全的入门读物。当然,这也为别人编撰形形色色的入门教程留下了空间。对了,本书还有配套习题集《C程序设计语言(第2版·新版)习题解答》(机械工业出版社,2004),也有影印版。
a)C标准库P. J. Plauger徐明亮等译 人民邮电出版社(即将出版)
函数库是编程语言的重要组成部份。但是此前出版的所有C语言专著中,对函数库都缺少特别全面深入的探讨。本书的出版,将挺好地弥补这一空白。作者是知名的C/C++专家,曾经兼任标准化委员会主席和C/C++ User's Journal的主编。更重要的是c程序设计语言电子版,他本人是一位知名的函数库开发者,为许多主流的编译器厂家提供函数库实现。本书几乎做到了极至——完整给出了C标准库的实现源代码,并一一进行解说。这使它有了与K&R C并列的资格。
入门
a) C语言程序设计:现代方式K.N.KING吕秀锋 译 人民邮电出版社
有人赞扬本书为“近10年来最好的一部C语言专著。”已被全球200多所中学采用为教材,包括哈佛大学、麻省理工学院、斯坦福大学等众多名校。书中对C语言主要知识点包括函数库的囊括都很全面深入。有些遗憾的是,此书原版出版时间较早,无法列入C99标准的新特点。不过,新版去年早已出版了,中文版相信也会很快更新。
a) C程序设计精典教程:第4版Harvey M.Deitel,Paul J.Deitel聂雪军 贺军 清华大学出版社
另一部大名鼎鼎的C语言专著,教材采用也很普遍。新版囊括了
C Primer Plus中文版(第五版)Stephen Prata人民邮电出版社
一本条理清晰、见解深刻的C语言教程。涵盖C99。内容很全面。
此外,还有Stephen Kochan《C语言编程(第三版)》(电子工业出版社)、Eric Roberts《C语言的科学与艺术》(机械工业出版社)、Hanly和Koffman《C语言详解(第5版)》(人民邮电出版社)等都是比较优秀的入门教材。国内近些年出版的之中,哈工大苏小红等的《C语言学院实用教程(第2版)》(电子工业出版社)、四川大学陈良银等的《C语言程序设计(C99版)》(清华大学出版社)是其中的佼佼者。
进阶
a) PETER VAN DER LINDEN徐波 译 人民邮电出版社
b) C圈套与缺陷ANDREW KOENIG高巍 人民邮电出版社
c) C语言没有Effective C这样的专著,其空白大约只有这两本书可以稍稍弥补,都属于不朽精典之列。最近中文版再度出版,反响热烈。
此外David Hanson的《C语言插口与实现:创建可重用软件的技术》是lcc作者之一的呕心之作,本来价值极高,但是毁在了翻译上,无法推荐了。
实战
a) C语言解惑ALAN R. FEUER杨涛 译 人民邮电出版社
本书内容最初是贝尔实验室的内部培训资料。作为C语言学习的辅导书,非常有用。
b) C语言名题精选百则方法篇 冼镜光 机械工业出版社
本书作者是德克萨斯技术学院的院长,选材较精,而且代码质量也比较高。
三、实验环境
Windows系统
Windows系统下推荐你们使用Code::blocks这个软件。这个软件最大优点是自带了基于mingw的GCC以及GDB,只要下载70M左右软件包,就可以完整支持C++、C语言编程了。各种功能(比如调试功能)也很强悍,版本更新也比较快。注意下载选择名子有mingw的文件,比如最新版本是codeblocks-10.05mingw-setup.exe(版本似乎有所不同)。
主页:
Linux系统
下面以CentOS 4.8为例,介绍怎么搭建Linux的C开发环境,如果是更高版本的CentOS也可以参考,只是要注意软件版本的不同。
GCC建议我们将一个版本的GCC安装在一个单独的目录下。这样做的益处是将来不需要它的时侯可以便捷地删掉整个目录即可(因为GCC没有uninstall功能);并且在安装完成后,仍然还能使用原先低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。缺点是在安装完成后要做一些设置工作能够使编译器工作正常。
1、下载GCC
到官方网站或官方FTP站ftp://ftp.gnu.org/gnu(建议使用FlashFXP下载工具)可以查找到下载资源。目前GCC的最新版本为 4.5.1。可供下载的文件通常有两种方式:gcc-4.5.1.tar.gz和gcc-4.5.1.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。
2、解压缩
根据压缩格式,选择下边相应的一种形式解包:
tar zvxf gcc-4.5.1.tar.gz或则tar jvxf gcc-4.5.1.tar.bz2
根据个人所好选择解压位置,新生成的gcc-4.5.1这个目录被称为源目录,我们用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。在${srcdir}/INSTALL目录下有详尽的GCC安装说明,可用浏览器打开index.html阅读。
我选择将gcc和glibc分别安装在/opt/gcc-4.5.1和/opt/glibc- 2.7下,因为若选择安装在/、/usr、/usr/local等位置,一些库文件会默认安装到 /lib下,有些库会默认安装到/usr/lib下,从而覆盖掉原有的工具链,这是我们所不希望的。
[root@localhost test]# pwd
/test/
[root@localhost test]# ls
gcc-4.5.1.tar.gz
[root@localhost test]# tar zvxf gcc-4.5.1.tar.gz
[root@localhost test]# ls
gcc-4.5.1 gcc-4.5.1.tar.gz
3、建立目标目录
目标目录(用${objdir}表示)是拿来储存编译结果的地方。GCC建议编译后的文件不要置于源目录${srcdir]中(虽然这样做也可以),最好单独储存在另外一个目录中,而且不能是${srcdir}的子目录。
例如,可以这样构建一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录):
[root@localhost test]# pwd
/test
[root@localhost test]# mkdir gcc-build
[root@localhost test]# ls
gcc-4.5.1 gcc-4.5.1.tar.gz gcc-build
以下的操作主要是在目标目录 ${objdir} 下进行。
4、配置
配置的目的是决定将GCC编译器安装到哪些地方(${destdir}),支持哪些语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。
配置是通过执行${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${srcdir}和${destdir}):
${srcdir}/configure --prefix=${destdir} [其它选项]
例如,如果想将GCC 4.5.1安装到/opt/gcc-4.5.1目录下,则${destdir}就表示这个路径。
在我的机器上,我是这样配置的:
[root@localhost test]# cd gcc-build/
[root@localhost gcc-build]# ../gcc-4.5.1/configure --prefix=/opt/gcc-4.5.1
--enable-threads=posix --disable-checking --enable--long-long
--host=i386-RedHat-linux --with-system-zlib
--enable-languages=c,c++,java
这样就将GCC安装在/opt/gcc-4.5.1目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。
附录和资料
一些有用的C语言网路资源:
C语言标准化组织ISO JTC1/SC22/WG14的主页,在这儿可以找到ISO C的文档:
《The Development of the C Language》作者Dennis Ritchie,极为精典的论文。
“C语言全景”这个网站内容很全面:
Dan Saks在embedded.com上的专栏Programming Pointer ,里面文章很有深度,值得一读。
这也是一个C语言资源汇总页面。
混乱C语言代码比赛c程序设计语言电子版,很知名。
另外一个C语言编程竞赛,主要面向黑客。
comp.lang.c以及c.moderated这两个讨论组推荐订阅,相当于互联网最大的C相关编程问题峰会:
这里对C语言的各类bit操作做了搜集整理,不少题目在笔试时侯时常出现。~seander/bithacks.html
台湾的惯C达人Jserv博客,建议你们订阅:~jserv/
一些值得关注及研究的C语言相关项目:
TinyCC,被好多项目用作动态编译C语言的编译器引擎:
GCC的标准库实现:
Glib是GTK的底层辅助编程库,与C标准库是不一样的,在C语言上实现了面向对象机制:
dietlibc在上面博客文章介绍过,C标准库的另一种实现:
一些C语言编程时可以使用的工具软件,帮你增强代码质量:
PMD可用于测量重复代码
llvm的静态剖析项目
C语言编程规范编程标准:
~ellard/CS50-96/programming-style.html
cert这个文档国外有英文翻译版本:+C+Secure+Coding+Standard
C语言编程电子书及教程:
这一本写的特别详尽,你可以把它看成是类似谭浩强版的教科书。
这一本云风以前推荐过,相当深入的介绍了C99标准,深入细节时侯须要读读。
这本书在网上留传一个英文版本,《编写优化、高效、无错地代码》,另外也有中文影印版《编程精粹》。
作者王聪,也是相当hard geek,从两个样章看,包含了相当多的内容。
《C语言深度解剖》这本可以在百度文库或google搜到,可以读读,有些参考性。
《C标准和实现》作者姚新颜,他的《深度探求C、C++》算是当初比较有深度的书籍,可惜早已绝版了。这本书也可以在百度文库搜到。这本书也比较值得读。
良葛格C语言学习笔记
C与C++的兼容性问题 %2B%2B
另一个文档关于C与C++标准兼容性问题:
《C Elements of Style》
《Linux安全编程》
《C Craft》电子版 ~blynn/c/
《The function pointer tutorials》函数表针教程。
C语言编程及Unix系统调用,想用C在Unix或则Linux编程的同学可以参考。
优化C、C++代码
图文并茂介绍C语言的表针
另外一篇介绍C语言优化的文章 ~cedb/local_copies/lee.html
一个C语言教学ppt
一些Unix下C语言编程相关的文章 ~choo/lupg/tutorials/index.html
Unix下怎么完善静态、动态C语言函数库 ~choo/lupg/tutorials/libraries/unix-c-libraries.html
如何使用GDB ~choo/lupg/tutorials/debugging/debugging-with-gdb.html
一些C语言编程方法 ~ctips/
Advanced C programming,高级C语言编程,可以提升水平,非常有帮助
C语言问答,这些题目也可用于笔试