从开始学C语言到现在也有五六年的时间了,也看了不少的好书和烂书,折腾了很多工具(编译器/编辑器圣战),在这里详细汇总一下。折腾久了能够得到一种思想,这种思想不同于那种“拿来主义”,而是“自己去做”的经验。
书籍类
这部分主要写一下我看过的书,主要是C/C++方面的。
我刚开始接触编程是从C语言开始的,然后慢慢过渡到C++的,其实现在回首看C语言,这种面向过程形式的用起来的感觉确实很简陋,但是在保证程序猿具有良好的数据结构和算法技能的同时能够发挥出最强大的性能。简单的说,C++在C的基础上增加了OO的东西(非常重要),并且封装好了一大批库,有很多牛人写的算法,直接用就可以了,不必担心性能。可以说C++是C的一个超集,但是C++不具有VLA(变长数组)。
以下书籍建议按照顺序阅读:
C语言
C Primer Plus
前置技能:无
我是由这本书入门C语言的,内容十分详实,但是有些地方感觉有些啰嗦。其实我第一本看的是谭浩强的《C语言程序设计》,与C Primer Plus相比之下不知道烂了多少条街。
C和指针
前置技能:C语言
虽然也是号称入门书,但是,最好还是具有C语言的经验之后再去看,里面对于指针和数据结构的探索深度写的很好。
读完上面两本,C语言就可以称作入门了,但是写代码需要长久的练习。
C++
如果具有了C语言的经验之后,学习C++就会事半功倍。因为C++中具有从C继承来的关键字,数据类型等。
C++ Primer
前置技能:C语言
我学习C++用的书是C++ Primer 4th,前段时间也入了本5th,用来补C++11的知识。其实不要看书名Primer,如果没有C基础的人还是不适合直接阅读这本书的,因为这本书的章节安排顺序对初学者很不友好,往往前面出现的一个东西你只有看到很后面的章节才会详细解释。所以建议看这本书之前,首先对C语言或者C++有个大概的概念。
根据4th和5th的对比来看,强烈建议从5th开始看,因为C++11是大改,具有非常多的新特性,直接上手就好。
其实C++ Primer内容的详尽程度近乎手册,真正做到了事无大小悉以教之。
这本书一定一定要认真看!
数据结构与算法分析——C语言描述
前置技能:C/C++
我看过严蔚敏的数据结构,但是总的来说,国内教材的风格是比不上国外的书籍有趣的。
对于学习数据结构和算法方面的知识我推荐这本书。
虽然说算法导论是巨著,但是对于初学者而言如果没有很好的数学技能,很容易搞不懂,所以还是先入手这本数据结构和算法分析吧!
从陷阱和缺陷中学习C/C++
前置技能:C/C++
很薄的的一本书,只有166页,淘宝团队出品的。
这本书不涉及任何C/C++语法的知识。有的只是各种错误用法的案例分析,完全都是干货啊,实用度满分。
进阶
前置技能:C++
C++方面的进阶书就多了。
深度探索C++对象模型
前置技能:熟悉C++的面向对象部分
在你读完C++ Primer之后,可能对类的构造以及虚函数之类的用法具有了一定的了解,这本书就是深入C++的对象特性,其实主要的篇幅是在讲述C++中类的构造、析构、拷贝的编译器实现,以及类的继承、多态等,还有函数语义、执行期的深入到编译器层面的知识,当然还有C++ OO里面重要的RAII机制,以及虚函数表的深度探索。
这本书能够让你更深入的了解C++的对象模型,正如这本书的名字一样,深度探索,强烈推荐!!
Effective C++:改善程序与设计的55个具体做法
前置技能:C++
这本书如上面的**从缺陷中学习C/C++**一样,不涉及C++的任何语法知识,有的只是对C++特性的误用或者C++设计时并没有考虑到的地方。
完全都是干货啊,这本书真的是常读常新的,如果可以我强联建议这55个梗概一定要背下来!!
STL源码剖析
前置技能:C++,STL
STL是C++的标准模板库,其中包含5个组件,分别为算法、容器、迭代器、函数、适配器。
STL源码剖析则是对STL的实现的算法以及数据结构的详尽分析,是一本非常好的书(侯婕先生译作必属精品),我最近正在读,打算自己写出一个STL出来。
语言无关
后面这几本书是C++偏服务器后端方向的,前面的几本书是不论用C/C++搞什么方向都可以看的,后面的基本就看个人的方向适当选择了。
现代操作系统
前置技能:C语言
从操作系统的发展开始讲起,然后逐步拓展到进程线程/存储管理/文件系统/输入输出/死锁等等。可以详细了解操作系统相关的知识。
TCP/IP详解 卷1:协议
W.Richchard Stevens的神书之一,对于想要学习TCP/IP协议的不二之书!
Uinx/Linux编程实践教程
在看APUE(Unix环境高级编程)
之前可以看这本书,但是这本书好像已经绝版了,可以去图书馆看,或者买影印版。
这本书通过分析设计并编写一个Linux下的工具来一步步引导你学习Unix/Linux下的知识,不过这本书有些老了,书中有的代码需要自己改进一下。
Unix网络编程 卷1:套接字联网API
W.Richchard Stevens的神书之一。传说中的UNP(UNIX Network Programing)
。第三版是顶级网络编程专家Bill Fenner和Andrew M. Rudoff应邀执笔,对已故大牛W. Richard Stevens的经典作品进行修订。增添了IPv6、SCTP协议和密钥管理套接字等内容,深入讨论了最新的关键标准、实现和技术。
是我等学习UNIX 网络编程的不二之作。
Unix环境高级编程
这本就是传说中的APUE(Advance Programing in the UNIX Environment)
。比前面写到的Uinx/Linux编程实践教程深度和广度都更大。
这本也是我等学习/进阶UNIX环境编程的不二之作啊。
关于Unix/Linux平台的东西你在Windows下是跑不起来的,所以看后面这三本书的话最好装个Linux或者搞个虚拟机。
工具类
其实学习C++并不需要什么特别的工具,主要是现在上市面上工具太多了,让人眼花缭乱,我最开始使用过VC6.0(十几年前的东西,但是现在好多学校还在用),经过社区上一群人把我骂醒之后(不支持新特性),我就选择了支持更新标准的Dev-cpp,现在在用SublimeText+GCC/Clang或者Visual Studio(宇宙最强IDE),其实不管你自己怎么配置,得到的也终究只是VS的一个子集,但是使用编辑器+编译器可以更好地理解编译/链接过程,也不失为一种技能。
废话不多说,对于初学者IDE我推荐使用Dev-cpp,可以在这里下载(带有MinGW)
当然如果想IDE的话可以使用VS:Visual Studio 2015 Professional Update2
自己想要安装环境的话可以使用在线安装或者使用我打包的离线版本,添加到系统PATH路径就可以了。
分析代码可以使用gprof,这是GCC提供的。
分析内存泄露在Windows下可以使用cppcheck,Linux下可以使用valgrind。
SubimeText+Gprof+Clang+cppcheck也是非常爽的一个组合,具体的可以看我的这篇博文:配置SublimeText为C/C++的轻量级IDE
文档手册类
在线文档
- cppReference(以此为主)
- cplusplus
- Standard C++
- MSDN的C++语言参考
- cdecl:一个很有趣的站点,输入C/C++语句会输出其代表的含义(英语)
离线文档
我现在常用的是离线的wikipedia(查IEEE很方便)+离线的cppReference还有cppReference的chm(方便查询)。