酷壳上的两篇文章,转载至此,学好C和C++。
我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:
虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
大量的封装好的类库也屏蔽了很多实现细节。
一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(上,下,续)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。
下面是我给这位朋友的一些建议:
鼓励并为你叫好。我鼓励你想要去学C语言的想法和精神,很多人都觉得C语言好学,其实并不然。(你可以看看《C语言的迷题》)现在的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术如果能够流行40多年,这才是你需要去关注和学习的技术,而不是那些刚出来的技术(过度炒作的技术,Windows编程史)。这才是踏踏实实的精神。
不要找借口。这一条路走下来并不容易,不要给自己找借口。我最不喜欢听到的就是“很忙,没有时间” 这样的借口。我以前在银行做项目,早9点到晚10点,周一到周六,我一样可以每天抽1个小时来看书和专研,一年下来也能精读5、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中有太多的设计模式,可以参考。
 

转载于:https://juejin.im/post/59f6e36ff265da432d276035

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

  1. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  2. 零基础程序员想要学好.Net,跟着这7个步骤学习就可以了

    作为一个初学者程序员,很喜欢问的一个问题就是:零基础如何自学编程?在后台也有很多读者私信我,问我这个问题,其实这个问题比较大,不是一两句就可以说清楚的. 所以,今天结合我个人的经历,跟大家分享下,要学 ...

  3. 思路不对努力白费!0基础学好C语言编程,必须掌握的学习思路!

    计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC6.0来教大家上机实验,那你不妨看看本文,这里有一些建议可以帮助你不会脱离社会太远 ...

  4. 关于如何快速学好,学懂Linux内核。内含学习路线

    学习linux内核,这个可不像学一门语言,c或者java一个月或者3月你就能精通掌握.学习linux内核是需要一步一步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章就来分享学习li ...

  5. edit怎么读英语_名师说学习:英语学习有方法

    如何学好英语,是困扰每一个英语学习者的问题.从多年英语教师的角度,巨人英语的老师和大家分享自己的看法. 汪维老师 /Profile/ 巨人学校金牌教师 从事英语教育工作16年 精通新概念.剑桥.中高考 ...

  6. 高效学习方法论的学习笔记

    Author:鲁力(地山) 0.前言与致谢 如何提高学习效率?这一问题长期以来都是网上讨论的热点话题,就这一问题网上很多大咖以书籍.博客.知乎回答.视频等不同形式都发表过自己的观点见解和方法论.笔者在 ...

  7. Linux学习中我的10条建议和技巧

    很多技术,没有所谓简单与复杂,只有知道与不知道,就像一层纸,捅透了就能看到后面的世界.任何看上去复杂的事物,拆解到最后就会发现都是由最简单的原理一层一层构成,每一层都会向上一层提供API,所有的事物都 ...

  8. python学习路线-2020年 Python学习路线及学习目标规划 拿走不谢!

    找不到完整的学习路线?小编分享2020年Python学习路线及学习目标规划拿走不谢,Python作为今年来特别受欢迎的编程语言,是AI时代头牌语言AI领域的敲门砖,Python已经入驻小学生教材,将来 ...

  9. 嵌入式系统的知识体系、学习误区及学习建议

    嵌入式系统的知识体系.学习误区及学习建议 1.嵌入式系统的知识体系     嵌入式系统的应用范围可以粗略分为两大类:电子系统的智能化(工业控制.现代农业.家用电器.汽车电子.测控系统.数据采集等),计 ...

  10. linux中断响应时间太慢_linux+arm系统学习与基础学习

    先说说arm吧.先前学习linux+arm老是觉得arm次要的,学习arm和学习单片机一样,了解了中断,UART,AD,定时器就差不多了,工作重心主要在linux上面.随着时间的推移,学习的深入,自我 ...

最新文章

  1. Apache Maven 2 简介
  2. 信息系统项目管理师-论文专题(一)论文写作框架+10大管理关系
  3. mysql 5.6.31 winx64_详解介绍MySQL5.6.31winx64.zip安装配置的图文教程
  4. 高性能MySQL之Count统计查询
  5. java中哪些可以私有化_《Java基础学习笔记》JAVA修饰符之私有化(Private)
  6. c 语言开发一个四则运算器,C++实现四则运算器(无括号)
  7. 10打开没有反应_118个遇水反应化学品清单及高压反应釜操作经验
  8. 腾讯开源视频动作检测算法DBG,打破两项世界纪录!
  9. Leetcode刷题之旅1
  10. ubuntu14安装tensorflow并测试
  11. 谷歌为什登不上去github_同声传译被攻陷!谷歌发布Translatotron直接语音翻译系统...
  12. IDL | 实验二、IDL语法基础
  13. 在html中怎样使用%3c符号,5个JavaScript和9个JQuery经典面试题
  14. 数据预处理01_脏数据产生的原因
  15. C# PDF 静默打印
  16. C语言怎样求矩阵上三角乘积,C语言经典算法 - 上三角、下三角、对称矩阵
  17. tolua unity 报错_unity tolua异常处理
  18. 强大的 Fresco(加载网络和本地图片)简单使用
  19. matlab 矩阵一致性检验,层次分析法判断矩阵求权值以及一致性检验程序.doc
  20. echarts 自定义甘特图

热门文章

  1. HDU1054 Strategic Game —— 最小点覆盖 or 树形DP
  2. 对SSH三大框架的理解
  3. 6月14号=》136页-145页
  4. HDOJ 2870 Largest Submatrix
  5. .NET中的加密类(对称加密)
  6. c3p0,dbcp与druid 三大连接池的区别[转]
  7. spring mvc 自定义编辑器
  8. c#asp.net添加/修改/删除Cookie值
  9. Myeclipse中JSP页面快捷键注释失效解决方法
  10. R与Python手牵手:数据探索性分析案例展示