如何学好C和C++?怎么学习C/C++?学习C和C++的技巧是什么?

酷壳上的两篇文章,转载至此,学好C和C++。
我相信,这多是不少朋友的问题,我之前也有这样的感受,编程编到必定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。好比:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,可是对于程序员来讲可能并不太好,缘由有两个:

虚拟机屏蔽了操做系统的系统调用,以及不少底层机制。
大量的封装好的类库也屏蔽了不少实现细节。
一段时间后,你会发现你知其然,不知因此然。。我之前在CSDN上写过一篇《Java NIO类库Selector机制解析(上,下,续)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,因此很难把技术学得更扎实。此时,一部分程序员会不天然地想学学底层的技术,很天然的,C语言就被提了上来。

下面是我给这位朋友的一些建议:

鼓励并为你叫好。我鼓励你想要去学C语言的想法和精神,不少人都以为C语言好学,其实并否则。(你能够看看《C语言的迷题》)如今的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术若是可以流行40多年,这才是你须要去关注和学习的技术,而不是那些刚出来的技术(过分炒做的技术,Windows编程史)。这才是踏踏实实的精神。
不要找借口。这一条路走下来并不容易,不要给本身找借口。我最不喜欢听到的就是“很忙,没有时间” 这样的借口。我之前在银行作项目,早9点到晚10点,周一到周六,我同样能够天天抽1个小时来看书和专研,一年下来也能精读五、6本书。我如今的工做项目 和招聘任务很紧张,刚生的小孩只有本身和老婆两人带,还须要准备讲课,可是我仍是可以找到时间看文章写文章维护酷壳。因此,我能够告诉你,“时间就像乳沟,只要你肯挤,就必定会有”。
学好C语言和系统编程。我认为,学好编程有四个方面:语言、算法和数据结构、系统调用和设计。
语言。我能够告诉你C语言有两大主题你要好好学,一个是内存管理,一个是指针!这个世界上90%以上的C/C++出的严重性错误全是和这两个有关。不要看谭浩强的那本书,那本是本烂书。推荐这本书给你《C程序设计语言(第2版·新版)》
算法和数据结构。我认为,用C语言实现算法和数据结构莫过于最爽的事情。推荐你看这本书——算法:C语言实现(第1~4部分)基础知识、数据结构、排序及搜索(原书第3版),还有那本经典的《算法导论》
系统编程。Windows下推荐两本书——《Windows 程序设计 》和《Windows核心编程》,Unix/Linux下推荐两本书——《Unix高级环境编程》和《Unix网络编程卷1,套接字》《Unix网络编程卷2,进程间通讯》尤为是《Unix网络编程》这本书,一通百通,不管Windows仍是Unix/Linux,都是同样的。
系统设计。关于设计方面,我全力推荐《Unix编程艺术》,看完之后,你就明白什么是真正的编程文化了。而后,当你看到Windows的Fans的某些言论时,你就知道什么叫一笑了之了。
若是你能在2-3年内精读完这些书,并所有融会贯通,那么你就明白什么是一览众山小的感受了!我足足花了5年时间才算是真正所有读完这些书的。最后,祝你好运!努力!

——-更新:2011/03/29 20:00——-

我想,这篇文章主要想告诉你们这么几件事:

编程编到必定时候,你就须要了解底层系统的机制,不然,知其然不知因此然。
我没有否认非C的程序员的逻辑,真正的逻辑是——若是你想要了解底层机制,请学习C语言和操做系统。
40多年的Unix/C影响深远。包括影响了Windows。若是你想一通百通,必定要了解Unix。那是计算机文化真正的根。
不要肤浅地去思考问题。好比,不要觉得一个DBA就不会考虑数据库引擎的内存页面的问题。也不要觉得Web程序员就不须要了解后台的服务器和脚本的运行性能以及TCP/IP的问题。
高手每每都是有很强的系统的基础知识的,表面的东西永远是肤浅的。

=== /

昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,因此,我把我我的的一些学习经验写在这里,但愿对你们有用。首先,由于如何学好C语言中谈到了算法和系统,因此这里就只谈C++语言。

C++是最难的语言。这个世界上最难的编程语言可能非C++莫属了。你千万不要觉得几天就能够学好C++,C++的学习曲线是至关BT的,你能够看看这篇文章。C++是一门很自由的语言,自由到了有点BT和恐怖的地步。我甚至认为C++并非一门成熟的编程语言,由于太容易犯错了。因此,你必定要在一开始就要有很当心谨慎的态度,并把C++当成一种难以训服的猛兽来看待。
多问“为何要这样”的问题。学习C++必定要多问几个“为何是这样”,“凭什么要这样”的问题。好比:很 多人知道C++有拷贝构造函数和初始化列表,但你真的知道为何要有拷贝构造函数?为何要有初始化列表吗?为何要有template,为何要有 RTTI,为何不是别的呢?难道就是为了让一门语言变得Cool一些吗?彻底不是这样的,C++中的任何一个feature都有些实实在在的缘由,你必定要去了解为何要把C++设计成这样的缘由,你才能学好C++。有空看看《C++演化和设计》一书。
看书,大量的C++书。你能够按以下前后顺序阅读(下面这些书,我花了大约4-5年的时间,今天我还在随时温习)
《C++ Primer》,这本初级读本可能让会你啃得很痛苦,全部的语言的特性和为何都在里面了,好好读读。固然由C++之父写的《C++程序设计语言》也不错。两本看一本就行了(我看的是前者)。
了解C++的语法仅仅是万里长征的第一步,你还须要看看《Effective C++》和《More Effective C++》这两本书并不厚,但我从02年就一直看到如今,每次读我都有新的体会,这两本书太经典了。若是你对C语言不熟,这两本书会让你回去补C语言的课。
Think in C++一样是另外一本经典之极的书,学c++必读,可是中文版的翻译的很很差,因此仍是去读英文版的吧。
《C++沉思录》一样很是值得一读,这里教的不是编程,而是思考的方法,这是至关珍贵的。
《Exceptional C++》和《More Exceptional C++》让你看看各类问题的解决方法和一些常见的经典错误。
《Advanced C++》和《Modern C++》可让你知道C++各类神奇的用法。
《泛型编程与STL》是把C++实践到了极致的东西。很强大。STL——神同样的模板库(容器,算法和函数对象),不得不服。
《深刻探索C++对象模型》让你了解编译器下的C++是什么样的,让你了解C++的性能并不差。这个对于C++的程序员太关键了。我之前写过的《C++虚函数表解析》还有《C++对象内存布局》属于这个范畴。
和Java语言作对比。我我的觉得Java对C++这个并不成熟的语言作了不少调整,规范和限制。因此,对比 一下Java和C++,想想,为何一些东西在C++中能够作,但在Java中却不行。好比:Java的异常是必须要catch的,否则就会编译不通 过。为何Java


不提供操做符重载?为会Java会引入接口来作多重继承?等等。Java体现着不少面向对象设计的东西,学习Java有助于你学会怎么更好地使用C++来编程。
面向对象设计 。虽然面向对象多是个骗局。可是我以为面向对象设计中的一些实践很是的不错,好比,单一原则,依赖倒置原则,等等,都很是地经典。《设计模式》必需一读,《面向对象的分析和设计》能够一读。但不能够设计模式为中心来编程,而应该是用设计模式来解藕。
类库学习。看看MFC是怎么封闭Windows API的,看看ACE是怎么面向对象的,看看boost是怎么玩面向对象的,看看CPPUnit又是怎么设计的。固然,Java的JDK中有太多的设计模式,能够参考。
相关文章
相关标签/搜索